Thuật toán này tương tự như thuật toán Dekker (Dekker’s Algorithm) nhưng cần sử dụng thêm một mảng interest để lưu mong muốn truy cập vào CS của các tiến trình.
Xét tiến trình i, các bước triển khai giải pháp như sau:
- Khởi tạo các biến chia sẻ (
turnvàinterest). - Tiến trình thể hiện mong muốn truy cập vào CS của nó bằng cách gán
interest[i] = truevà đồng thời trao cho tiến trìnhjkhác một cơ hội để có thể truy cập CS. - Nếu tiến trình
jcó mong muốn truy cập CS (interest[j] = true) và biếnturn = jthì tiến trìnhisẽ cần phải chờ đến khi nào một trong hai điều kiện này có giá trị làfalse. - Sau khi vào CS và thoát ra khỏi CS, tiến trình
icần phải gán lạiinterest[i] = falsecho biết rằng nó không còn muốn truy cập vào CS nữa.
Giả sử có hai tiến trình là P0 và P1. Khai báo hai biến chia sẻ turn và interest:
int turn = 0;
bool interest[2] = [false, false];Xét đoạn code triển khai giải pháp Peterson của tiến trình P0:
do {
interest[0] = true; // P0 wants in
turn = 1; // P0 gives a chance to P1
while (interest[1] && turn == 1) // Wait if P1 wants to enter the critical section and it's not my turn
{
// busy waiting
}
// critical section
// ...
// end critical section
interest[0] = false; // P0 no longer wants in
// remainder section
} while(1);Có các trường hợp sau, với điều kiện là interest[0] = true:
- Nếu
interest[1] = truevàturn = 1: tiến trình P0 cần phải chờ, tiến trình P1 được phép truy cập vào CS. - Nếu
interest[1] = truevàturn = 0: tiến trình P0 được phép truy cập vào CS, tiến trình P1 cần phải chờ. - Nếu
interest[1] = falsevàturn = 0: tiến trình P0 được phép truy cập vào CS. - Nếu
interest[1] = falsevàturn = 1: tiến trình P0 được phép truy cập vào CS.
Có thể thấy ở trường hợp 4, mặc dù không phải lượt của tiến trình P0 nhưng nếu P1 không muốn vào CS thì P0 vẫn có thể truy cập vào CS. Cách làm này giải quyết được vấn đề của thuật toán Dekker.
Nói cách khác, nếu một tiến trình có nhu cầu vào CS thì nó sẽ không bị ngăn cản bởi các tiến trình khác đang ở trong RS.