- Đọc/Ghi ngày, tháng, năm
b) Thuật tốn 2: Sử dụng biến luân phiên, thuật tốn dùng cho hai tiến trình nhƣng vẫn cịn
trƣờng hợp sai. Ý tƣởng nhƣ sau:
Hai tiến trình A, B sử dụng chung biến turn với ý nghĩa sau: turn = 0, tiến trình A đƣợc vào miền găng, turn=1 thì B đƣợc vào miền găng. Turn đƣợc gán trị ban đầu là 0, tức là A đƣợc vào trƣớc. Nếu turn = 0, tiến trình A đƣợc vào miền găng. Nếu turn = 1, tiến trình A đi vào một vịng lặp chờ đến khi turn nhận giá trị 0 thì A đƣợc vào miền găng. Khi tiến trình A rời khỏi miền găng, nĩ đặt giá trị turn về 1 để cho phép tiến trình B đi vào miền găng.
// tiến trình A while (1) {
while (turn == 1); // neu turn=1 thi A vao vong while de doi critical-section (); //turn=0 thi A duoc vao mien gang turn = 1; //gan turn=1 de cho B vao mg
Noncritical-section (); }
// tiến trình B while (1) {
while (turn == 0); //neu turn=0 thi B vao vong while de doi critical-section (); //turn=1 thi B duoc vao mien gang
turn = 0; //gan turn=0 de cho A vao mg Noncritical-section ();
}
Nhận xét: Hai tiến trình chắc chắn khơng thể vào miền găng cùng lúc, vì tại một thời điểm turn
chỉ cĩ một gía trị. Nhƣng cĩ thể vi phạm điều kiện thứ ba là một tiến trình cĩ thể bị ngăn chặn vào miền găng bởi một tiến trình khác khơng ở trong miền găng. Thực vậy giả sử tiến trình A đang ở trong phần Noncritical-section(), thì B khơng thể vào miền găng hai lần liên tiếp. Nhƣ vậy, giải pháp này phụ thuộc vào tốc độ thực hiện của hai tiến trình, nĩ vi phạm cả điều kiện thứ hai.