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:

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 69)

- Đọ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ị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 }

Nhn 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.

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 69)

Tải bản đầy đủ (PDF)

(200 trang)