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.

Cái bàn của hiền triết

Go down

Cái bàn của hiền triết  Empty Cái bàn của hiền triết

Bài gửi  NguyenCongTri(HLT3) 26/4/2014, 20:25

DINING-PHILOSOPHERS (Có DEADLOCK)

#include
#include

#define numPhilosophers 5

#define LEFT id
#define RIGHT (id+1)%numPhilosophers

HANDLE chopsticks[numPhilosophers];
char chState[numPhilosophers+1];
char phState[numPhilosophers+1];

void PhilosopherThread(int id){
while (1) {
// Suy nghĩ ...
Sleep(GetTickCount()%2000);
// Đói, do vậy lấy đũa bên Trái
phState[id]='d';
WaitForSingleObject(chopsticks[LEFT], INFINITE);

chState[LEFT]='0';
printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);
Sleep(GetTickCount()%100);

// Rồi lấy đũa bên phải
WaitForSingleObject(chopsticks[RIGHT], INFINITE);
chState[RIGHT]='0';
// Bắt đầu ăn ...
phState[id]='a';
printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);
Sleep(GetTickCount()%1000);
// Ăn xong
phState[id]='-';
// Đặt đũa trái xuống
chState[LEFT]='1';
ReleaseMutex(chopsticks[LEFT]);
// Đặt đũa phải xuống
chState[RIGHT]='1';
ReleaseMutex(chopsticks[RIGHT]);
}
}
void main(){
HANDLE handles[numPhilosophers];
DWORD threadID; int i;

chState[numPhilosophers]='\0'; phState[numPhilosophers]='\0';

for (i=0; i chState[i]='1'; phState[i]='-';
}
for (i=0; i chopsticks[i]=CreateMutex(0, FALSE, 0);

printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);

for (i=0; i handles[i]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)PhilosopherThread,
(void *) i, 0, &threadID);
WaitForMultipleObjects(numPhilosophers, handles, TRUE, INFINITE);
for (i=0; i}


DINING-PHILOSOPHERS (Không DEADLOCK)

#include
#include

#define numPhilosophers 5

#define LEFT id
#define RIGHT (id+1)%numPhilosophers

HANDLE chopsticks[numPhilosophers];
char chState[numPhilosophers+1];
char phState[numPhilosophers+1];

void PhilosopherThread(int id){
HANDLE cs[2];
while (1) {
// Suy nghĩ ...
Sleep(GetTickCount()%1000);
// Đói, do vấy lấy hai đũa Trái - Phải
phState[id]='d';

cs[0]=chopsticks[LEFT];
cs[1]=chopsticks[RIGHT];
WaitForMultipleObjects(2, cs, TRUE, INFINITE);
chState[LEFT]='0';
chState[RIGHT]='0';
// Bắt đầu ăn ...
phState[id]='a';
printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n",
chState, phState);
Sleep(GetTickCount()%1000);
// Ăn xong
phState[id]='-';
chState[LEFT]='1'; ReleaseMutex(chopsticks[LEFT]);
chState[RIGHT]='1'; ReleaseMutex(chopsticks[RIGHT]);
}
}

void main(){
HANDLE handles[numPhilosophers];
DWORD threadID; int i;

chState[numPhilosophers]='\0'; phState[numPhilosophers]='\0';

for (i=0; i chState[i]='1'; phState[i]='-';
}
for (i=0; i chopsticks[i]=CreateMutex(0, FALSE, 0);

printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);

for (i=0; i handles[i]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)PhilosopherThread,
(void *) i, 0, &threadID);
WaitForMultipleObjects(numPhilosophers, handles, TRUE, INFINITE);
for (i=0; i}
Vấn đề Deadlock xảy ra khi đồng thời các nhà hiền triết cùng nhau lấy đũa trái, nếu không ai chịu bỏ đũa của mình xuống thì sẽ không ai được ăn.
Cách giải quyết Deadlock được thực hiện như sau:
Một nhà hiền triết nào đó nhanh tay lấy hai đũa trái và phải, khi ăn xong thi hiền triết bỏ đũa xuống. Vậy tức là người sau sẽ được ăn.

NguyenCongTri(HLT3)

Tổng số bài gửi : 3
Join date : 14/03/2014

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