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 locktrue (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.

  1. P0 gọi thực thi hàm TestAndSet và gán giá trị cho locktrue sau đó trả về giá trị của lock trước đó là false.
  2. Do giá trị của TestAndSetfalse nên vòng lặp bị dừng lại và tiến trình P0 có thể truy cập vào CS.
  3. 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 TestAndSet luôn là true, dẫn đến việc vòng lặp while vẫn tiếp tục được thực thi.
  4. Sau khi tiến trình P0 thực thi xong, biến lock sẽ đượ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.

Resources