Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Giải pháp đúng dùng Semaphore

Go down

Giải pháp đúng dùng Semaphore Empty Giải pháp đúng dùng Semaphore

Bài gửi  NguyenVanTung 13/5/2009, 17:01

#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 */
}
}
NguyenVanTung
NguyenVanTung

Tổng số bài gửi : 36
Join date : 06/03/2009
Age : 38
Đến từ : 140 Lê Trọng Tấn, P.Tây Thạnh, Q.Tân Phú, Tp.HCM

http://www.cntp.edu.vn

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết