-84-
PRODUCER BOUNDED CONSUMER
BUFFER
Bài toán Producer-Consumer
Bài toán 5 triết gia ăn tối
Bài tốn tiệm cắt tóc Một số bài tốn về đồng bộ
-92-
Dining philosophers: Semaphore
semaphore mutex = 1;
semaphore s[N];
void philosopher( int i) // i : xác định triết gia nào (0..N-1) {
while (TRUE) {
take_forks(i); // yêu cầu đến khi cĩ đủ 2 nĩa eat(); // yum-yum, spaghetti
put_forks(i); // đặt cả 2 nĩa lên bàn lại thinhk(); // Suy nghĩ
}} }
-93-
Dining philosophers: Semaphore
void take_forks ( int i) // i : xác định triết gia nào (0..N-1) {
while (TRUE) {
down(mutex); // vào miền găng
state[i] = HUNGRY; // ghi nhận triết gia i đã đĩi test(i); // cố gắng lấy 2 nĩa
up(mutex); // ra khỏi miền găng
down(s[i]); // chờ nếu khơng cĩ đủ 2 nĩa }
-94-
Dining philosophers: Semaphore
void put_forks ( int i) // i : xác định triết gia nào (0..N-1) {
while (TRUE) {
down(mutex); // vào miền găng
state[i] = THINKING; // ghi nhận triết gia i ăn xong test(LEFT); // kiểm tra người bên trái đã cĩ thể ăn? test(RIGHT); // kiểm tra người bên phải đã cĩ thể ăn? up(mutex); // ra khỏi miền găng
}} }
-98-
Bài 1. Một biến X được chia sẻ bởi hai tiến trình cùng thực hiện đoạn
code sau : do
X = X +1;
if ( X == 20) X = 0; while ( TRUE );
Bắt đầu với giá trị X = 0, chứng tỏ rằng giá trị X cĩ thể vượt quá 20. Cần sửa chữa đoạn chương trình trên như thế nào để bảo đảm X khơng vượt quá 20 ?
Bài 2.Xét hai tiến trình xử lý đoạn chương trình sau :
process P1 { A1 ; A2 } process P2 { B1 ; B2 }
Đồng bộ hố hoạt động của hai tiến trình này sao cho cả A1 và B1 đều hồn tất trước khi A2 hay B2 bắt đầu .
Bài 3. Trong giải pháp Semaphore cho bài tốn triết gia, tại sao phải
đặt state[i] = HUNGRY trong take_forks ?