Một số hệ điều hành cung cấp một hàm atomic (không thể chia nhỏ) cho phép một tiến trình khóa CS lại khi thực hiện truy xuất và chỉ mở khóa sau khi kết thúc truy xuất.
Sử dụng một biến chia sẻ lock với giá trị khởi tạo là false như sau:
bool lock = false;Sử dụng một hàm có tên là TestAndSet, có các tính chất sau:
- Đối số là biến
lock. - Thực hiện gán giá trị cho
locklàtrue(tương ứng với thao tác khóa CS). - Trả về giá trị trước đó của
lock.
bool TestAndSet(bool &target)
{
bool prev = target;
target = true;
return prev;
}Trong đoạn code của một tiến trình bất kỳ, ta sử dụng hàm TestAndSet như là điều kiện lặp của vòng lặp while như sau:
do {
while (TestAndSet(lock));
// critical section
lock = false;
// remainder section
} while(1);Giả sử ta có hai tiến trình P0, P1 đều mong muốn truy cập vào CS và tiến trình P0 được thực thi trước.
- P0 gọi thực thi hàm
TestAndSetvà gán giá trị cholocklàtruesau đó trả về giá trị củalocktrước đó làfalse. - Do giá trị của
TestAndSetlàfalsenên vòng lặp bị dừng lại và tiến trình P0 có thể truy cập vào CS. - Trong lúc P0 truy cập CS, P1 sẽ không thể truy cập vào CS do giá trị trả về của
TestAndSetluôn làtrue, dẫn đến việc vòng lặpwhilevẫn tiếp tục được thực thi. - Sau khi tiến trình P0 thực thi xong, biến
locksẽ được gán giá trị làfalse(tương ứng với việc mở khóa CS). Khi đó, P1 có thể thực hiện việc truy cập vào CS.