- Đọc/Ghi ngày, tháng, năm
a) Thuật tốn 1: Sử dụng biến cờ hiệu, thuật tốn mong đợi dùng cho nhiều tiến trình nhƣng vẫn
cịn trƣờng hợp sai. Ý tƣởng nhƣ sau:
Các tiến trình dùng chung biến cờ hiệu lock , với ý nghĩa lock=0 là khơng cĩ tiến trình trong miền găng, lock=1 là cĩ một tiến trình trong miền găng. lock đƣợc gán trị ban đầu là 0. Một tiến trình muốn vào miền găng trƣớc tiên kiểm tra giá trị của biến lock. Nếu lock = 0, tiến trình đặt lại giá trị cho lock = 1 và đi vào miền găng. Nếu lock đang cĩ giá trị 1, tiến trình phải chờ bên ngồi miền găng cho đến khi lock cĩ giá trị 0.
lock=0; //biến dùng chung cho mọi tiến trình
while (1) //một tiến trình cĩ thể truy xuất miền găng nhiều lần
{ // nếu lock=1 là cĩ tiến trình nào đĩ trong miền găng, dùng vịng lặp while để đợi while (lock == 1);
//nếu lock=0 thốt khỏi while, trƣớc khi vào mg gán lock=1 để khơng cho các tiến trình khác vào mg (độc quyền vào mg).
lock = 1;
critical-section (); //đoạn mã truy xuất dữ liệu dùng chung mà cĩ thể gây ra lỗi. lock = 0; //cho phép các tiến trình khác vào mg.
noncritical-section(); //đoạn mã khơng phải mg }
Nhận xét: Giải pháp này vẫn cĩ thể vi phạm điều kiện thứ nhất là hai tiến trình cĩ thể cùng ở
trong miền găng tại một thời điểm. Thực vậy, giả sử một tiến trình nhận thấy lock = 0 và chuẩn bị vào miền găng, nhƣng trƣớc khi nĩ cĩ thể đặt lại giá trị cho lock là 1, nĩ bị tạm dừng để một tiến trình khác hoạt động. Tiến trình thứ hai này thấy lock vẫn là 0 thì đặt lại lock = 1 và vào miền găng. Sau đĩ tiến trình thứ nhất đƣợc tái kích hoạt, nĩ gán lock = 1 rồi vaị miền găng. Nhƣ vậy tại thời điểm đĩ cả hai tiến trình đều ở trong miền găng.