Giải pháp đúng dùng Semaphore
Trang 1 trong tổng số 1 trang
Giải pháp đúng dùng Semaphore
#include “prototype.h”
#define N 5 /* Số hiền triết */
#define LEFT (i+N-1) % N /* Số bên trái người i */
#define RIGHT (i+1) % N /* Số bên phải người i*/
#define THINKING 0 /* Trạng thái đang Nghĩ */
#define HUNGRY 1 /* Trạng thái đang Đói */
#define EATING 2 /* Trạng thái đang Ăn */
typedef int semaphore;
int State [ N ]; /* Mảng trạng thái các hiền triết */
semaphore mutex = 1; /* Đèn hiệu dùng để bảo vệ VTT */
semaphore S [ N ]; /* Mỗi người 1 Đèn hiệu chờ ăn */
void philosopher ( int i ) { /* i = 0, 1, ... , N-1 */
s [ i ] = 0; /* Đèn hiệu của người i nhận trị ban đầu */
while ( 1 ) {
think ( ); /* Đang nghĩ */
take_chopsticks ( i );/* Được 2 đũa hoặc phải chờ */
eat ( ); /* Ăn */
put_chopsticks ( i ); /* Đặt 2 đũa xuống */
}
}
void take_chopsticks ( int i ) { /* i = 0, 1, ... , N-1 */
wait (&mutex);
State [ i ] = HUNGRY; /* Ghi nhận là i đói */
test ( i ); /* Tìm cách lấy 2 đũa */
signal (&mutex);
wait ( &S [ i ] ); /* Phải chờ nếu Không lấy được 2 đũa */
}
void put_chopsticks ( int i ) { /* i = 0, 1, ... , N-1 */
wait (&mutex);
State [ i ] = THINKING; /* Ghi nhận là i ăn xong*/
test(LEFT); /* Kiểm tra người bên Trái có đang ăn không ? */
test(RIGHT);/* Kiểm tra người bên Phải có đang ăn không ? */
signal (&mutex);
}
void test ( int i ) { /* i = 0, 1, ... , N-1 */
if ( State[i] == HUNGRY && State [LEFT] != EATING && State [RIGHT] != EATING ) {
/* Nếu i đói và 2 bên Không ăn */
State [ i ] = EATING; /* Cho i ăn */
signal ( &S [ i ] ); /* Báo hiệu là i được ăn */
}
}
#define N 5 /* Số hiền triết */
#define LEFT (i+N-1) % N /* Số bên trái người i */
#define RIGHT (i+1) % N /* Số bên phải người i*/
#define THINKING 0 /* Trạng thái đang Nghĩ */
#define HUNGRY 1 /* Trạng thái đang Đói */
#define EATING 2 /* Trạng thái đang Ăn */
typedef int semaphore;
int State [ N ]; /* Mảng trạng thái các hiền triết */
semaphore mutex = 1; /* Đèn hiệu dùng để bảo vệ VTT */
semaphore S [ N ]; /* Mỗi người 1 Đèn hiệu chờ ăn */
void philosopher ( int i ) { /* i = 0, 1, ... , N-1 */
s [ i ] = 0; /* Đèn hiệu của người i nhận trị ban đầu */
while ( 1 ) {
think ( ); /* Đang nghĩ */
take_chopsticks ( i );/* Được 2 đũa hoặc phải chờ */
eat ( ); /* Ăn */
put_chopsticks ( i ); /* Đặt 2 đũa xuống */
}
}
void take_chopsticks ( int i ) { /* i = 0, 1, ... , N-1 */
wait (&mutex);
State [ i ] = HUNGRY; /* Ghi nhận là i đói */
test ( i ); /* Tìm cách lấy 2 đũa */
signal (&mutex);
wait ( &S [ i ] ); /* Phải chờ nếu Không lấy được 2 đũa */
}
void put_chopsticks ( int i ) { /* i = 0, 1, ... , N-1 */
wait (&mutex);
State [ i ] = THINKING; /* Ghi nhận là i ăn xong*/
test(LEFT); /* Kiểm tra người bên Trái có đang ăn không ? */
test(RIGHT);/* Kiểm tra người bên Phải có đang ăn không ? */
signal (&mutex);
}
void test ( int i ) { /* i = 0, 1, ... , N-1 */
if ( State[i] == HUNGRY && State [LEFT] != EATING && State [RIGHT] != EATING ) {
/* Nếu i đói và 2 bên Không ăn */
State [ i ] = EATING; /* Cho i ăn */
signal ( &S [ i ] ); /* Báo hiệu là i được ăn */
}
}
Similar topics
» Thảo luận Bài 7
» Xét một giải pháp semaphore đúng cho bài toán Dining philosophers
» Phương pháp dùng Semaphore
» Dùng Semaphore giải quyết bài toán Sản xuất — Tiêu dùng
» Thảo luận Bài 7
» Xét một giải pháp semaphore đúng cho bài toán Dining philosophers
» Phương pháp dùng Semaphore
» Dùng Semaphore giải quyết bài toán Sản xuất — Tiêu dùng
» Thảo luận Bài 7
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết