- Đọ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:
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.