5 .4Một số bài toỏn đồng bộ
5.5 Monitor
5.5.2 Biến điều kiện
Monitor được định nghĩa như trờn cho phộp giải quyết vấn đề loại trừ tương hỗ. Tuy nhiờn, cú thể xẩy ra vấn đề khỏc về đồng bộ, chẳng hạn khi một tiến trỡnh đang thực hiện trong monitor và phải dừng lại (bị phong tỏa) để đợi một sự kiện hay một điều kiện nào đú được thỏa món. Trong trường hợp như vậy, tiến trỡnh cần trả lại monitor để tiến trỡnh khỏc cú thể sử dụng. Tiến trỡnh chờ đợi sẽ được khụi phục lại từ điểm dừng sau khi điều kiện đang chờ đợi được thỏa món.
Để giải quyết tỡnh huống vừa nờu, ta cú thể sử dụng cỏc biến điều kiện. Đõy là những biến được khai bỏo và sử dụng trong monitor với hai thao tỏc là cwait và csignal (tiền tố “c” được thờm vào để phõn biệt với cờ hiệu) như sau:
- x.cwait (): tiến trỡnh đang ở trong monitor và gọi cwait bị phong tỏa cho tới khi điều kiện x xẩy ra. Tiến trỡnh bị xếp vào hàng đợi của biến điều kiện x. Monitor được giải phúng và một tiến trỡnh khỏc sẽ được vào monitor.
- x.csignal (): tiến trỡnh gọi csignal để thụng bỏo điều kiện x đó thỏa món. Nếu cú tiến trỡnh đang bị phong tỏa và nằm trong hàng đợi của x do gọi x.cwait() trước đú thỡ một tiến trỡnh như vậy sẽ được giải phúng. Nếu khụng cú tiến trỡnh bị phong tỏa thỡ thao tỏc csignal sẽ khụng cú tỏc dụng gỡ cả.
Cần lưu ý điểm khỏc nhau của csignal với signal của cờ hiệu: signal luụn giải phúng một tiến trỡnh cũn csignal thỡ cú thể khụng, nếu khụng cú tiến trỡnh chờ đợi điều kiện.
Cấu trỳc monitor với cỏc biến điều kiện được thể hiện trờn 35
Hỡnh 35 Monitor
Để minh họa cho cỏch sử dụng monitor, chỳng ta sẽ xem xột một giải phỏp cho bài toỏn người sản xuất người tiờu dựng với bộ đệm hạn chế, trong đú cơ chế đồng bộ được thực hiện bằng monitor (hỡnh 2.20). Trong giải phỏp này, bộ đệm buffer được khai bỏo như dữ liệu cục bộ của monitor cú thể truy cập bằng hai thao tỏc append (thờm vào) và take (lấy ra). Monitor sử dụng hai biến điều kiện notFull và notEmpty để trỏnh việc thờm sản phẩm vào bộ đệm đầy hoặc lấy sản phẩm khỏi bộ đệm rỗng.
monitor BoundedBuffer {
product buffer[N]; //bộ đệm chứa N sản phẩm kiểu product
int count; //số lượng sản phẩm hiện thời trong bộ đệm
condition notFull, notEmpty; //cỏc biến điều kiện
public:
BoundedBuffer( ) { //khởi tạo
count = 0; }
void append (product x) { if (count == N)
notFull.cwait ( ); //dừng và chờ đến khi buffer cú chỗ
<Thờm một sản phẩm vào buffer> count++; notEmpty.csignal (); } product take ( ) { if (count == 0)
notEmptry.cwait (); //chờ đến khi buffer khụng rỗng
notFull.csignal ( ); }
}
void producer ( ) for (;;){
{ //tiến trỡnh người sản xuất
<Sản xuất sản phẩm x> BoundedBuffer.append (x); } } void consumer ( ) for (;;){
{ //tiến trỡnh người tiờu dựng
product x = BoundedBuffer.take (); <Tiờu dựng x>
} }
void main() {
Thực hiện song song producer và consumer. }