Cái bàn của hiền triết
Trang 1 trong tổng số 1 trang
Cái bàn của hiền triết
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.
#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
}
for (i=0; i
printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);
for (i=0; i
(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
}
for (i=0; i
printf("- Chopsticks:\t%s\n Philosophers:\t%s\n\n", chState, phState);
for (i=0; i
(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
Similar topics
» Thảo luận Bài 7
» Thảo luận Bài 7
» bài toán hiền triết cùng ăn.
» Ví dụ về DeadLock - Các bạn xem xó đúng hay không?
» Bài toán Hiền triết cùng ăn.
» Thảo luận Bài 7
» bài toán hiền triết cùng ăn.
» Ví dụ về DeadLock - Các bạn xem xó đúng hay không?
» Bài toán Hiền triết cùng ăn.
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