bài toán hiền triết cùng ăn.
+4
phuong.ntt-08h1010074
phuongdtk
lqhlam
lyhuyvinh
8 posters
Trang 1 trong tổng số 1 trang
bài toán hiền triết cùng ăn.
bài toán hiền triết cùng ăn
- Năm nhà hiền triết ngồi quanh một chiếc bàn tròn
- Trên bàn, giữa họ là những chiếc đũa.
- Các nhà hiền triết độc lập với nhau và trầm tư suy nghĩ.
- Khi đói, mỗi người nhấc đũa 2 bên và nếu được cả đôi thì bắt đầu ăn, sau đó đặt từng chiếc đũa về vị trí cũ.
- Cần lập trình hành vi của mỗi hiền triết để không xảy ra Deadlock.
- Deadlock xảy ra khi: Các hiền triết cùng một lúc nhấc đũa bên trái hoặc đũa bên phải. Cứ thế chờ nhau mà không ai được ăn cả. Đó là hiện tượng Chờ xoay vòng (Circular Waiting).
- Thuật giải chính: Mỗi hiền triết tìm cách lấy đủ 2 đũa hai bên. Không đủ 2 đũa, không lấy.
Các ký hiệu:
‘d’ : đói.
‘a’ : đang ăn
‘-‘ : đang suy nghĩ.
Chopsticks[]: mảng đèn hiệu các cây đũa, chopstick[i]=TRUE, đũa rảnh có thể lấy.
Mảng cs[2]: trạng thái cây đũa bên trái và bên phải
WaitForMultipleObjects(2, cs, TRUE, INFINITE); chờ cho tới khi cs[0],cs[1] đều có giá trị là TRUE.
ReleaseMutex(chopsticks[LEFT]): nhả đèn hiệu của 1 cây đũa.
#define numPhilosophers 5
#define LEFT id
#define RIGHT (id+1)%numPhilosophers
HANDLE chopsticks[numPhilosophers]; // mang(den hieu)
char chState[numPhilosophers+1]; // mang trang thai cac cay dua
char phState[numPhilosophers+1]; // mang trang thai cac nha hien triet
void PhilosopherThread(int id){
HANDLE cs[2];
while (1) {
// Suy nghi ...
Sleep(GetTickCount()%1000);
// Doi, do vay tim cach lay du 2 dua Trai-Phai
phState[id]='d';
cs[0]=chopsticks[LEFT];
cs[1]=chopsticks[RIGHT];
// Cho den khi co du 2 dua Trai-Phai
WaitForMultipleObjects(2, cs, TRUE, INFINITE); // chờ cho toi khi cs[0],cs[1] cung co gia tri la TRUE.
chState[LEFT]='0'; // Khi cho xong xét trang thái dua bận
chState[RIGHT]='0';
// Bat dau an ...
phState[id]='a';
printf("- Chopsticks:\\t%s\\n Philosophers:\\t%s\\n\\n", chState, phState);
Sleep(GetTickCount()%1000);
// An xong trở lại trạng thái suy nghĩ
phState[id]='-';
chState[LEFT]='1'; ReleaseMutex(chopsticks[LEFT]); // Dat dua Trai xuong
chState[RIGHT]='1'; ReleaseMutex(chopsticks[RIGHT]);// Dat dua Phai xuong
}
}
void main(){
HANDLE handles[numPhilosophers];
DWORD threadID; int i;
// khởi tạo trạng thái ban đầu, tất cả hền triết đều đang suy nghĩ.
chState[numPhilosophers]='\\0'; phState[numPhilosophers]='\\0';
for (i=0; i<numPhilosophers; i++){
chState[i]='1'; phState[i]='-';
}
for (i=0; i<numPhilosophers; i++) // trạng thái đèn hiệu
chopsticks[i]=CreateMutex(0, FALSE, 0);
printf("- Chopsticks:\\t%s\\n Philosophers:\\t%s\\n\\n", chState, phState);
for (i=0; i<numPhilosophers; i++)
// tạo tiến trình các nhà hiền triết. chạy hàm PhilosopherThread.
handles[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)PhilosopherThread,(void *)i,0,&threadID);
WaitForMultipleObjects(numPhilosophers, handles, TRUE, INFINITE);
for (i=0; i<numPhilosophers; i++) CloseHandle(chopsticks[i]);
}
- Năm nhà hiền triết ngồi quanh một chiếc bàn tròn
- Trên bàn, giữa họ là những chiếc đũa.
- Các nhà hiền triết độc lập với nhau và trầm tư suy nghĩ.
- Khi đói, mỗi người nhấc đũa 2 bên và nếu được cả đôi thì bắt đầu ăn, sau đó đặt từng chiếc đũa về vị trí cũ.
- Cần lập trình hành vi của mỗi hiền triết để không xảy ra Deadlock.
- Deadlock xảy ra khi: Các hiền triết cùng một lúc nhấc đũa bên trái hoặc đũa bên phải. Cứ thế chờ nhau mà không ai được ăn cả. Đó là hiện tượng Chờ xoay vòng (Circular Waiting).
- Thuật giải chính: Mỗi hiền triết tìm cách lấy đủ 2 đũa hai bên. Không đủ 2 đũa, không lấy.
Các ký hiệu:
‘d’ : đói.
‘a’ : đang ăn
‘-‘ : đang suy nghĩ.
Chopsticks[]: mảng đèn hiệu các cây đũa, chopstick[i]=TRUE, đũa rảnh có thể lấy.
Mảng cs[2]: trạng thái cây đũa bên trái và bên phải
WaitForMultipleObjects(2, cs, TRUE, INFINITE); chờ cho tới khi cs[0],cs[1] đều có giá trị là TRUE.
ReleaseMutex(chopsticks[LEFT]): nhả đèn hiệu của 1 cây đũa.
#define numPhilosophers 5
#define LEFT id
#define RIGHT (id+1)%numPhilosophers
HANDLE chopsticks[numPhilosophers]; // mang(den hieu)
char chState[numPhilosophers+1]; // mang trang thai cac cay dua
char phState[numPhilosophers+1]; // mang trang thai cac nha hien triet
void PhilosopherThread(int id){
HANDLE cs[2];
while (1) {
// Suy nghi ...
Sleep(GetTickCount()%1000);
// Doi, do vay tim cach lay du 2 dua Trai-Phai
phState[id]='d';
cs[0]=chopsticks[LEFT];
cs[1]=chopsticks[RIGHT];
// Cho den khi co du 2 dua Trai-Phai
WaitForMultipleObjects(2, cs, TRUE, INFINITE); // chờ cho toi khi cs[0],cs[1] cung co gia tri la TRUE.
chState[LEFT]='0'; // Khi cho xong xét trang thái dua bận
chState[RIGHT]='0';
// Bat dau an ...
phState[id]='a';
printf("- Chopsticks:\\t%s\\n Philosophers:\\t%s\\n\\n", chState, phState);
Sleep(GetTickCount()%1000);
// An xong trở lại trạng thái suy nghĩ
phState[id]='-';
chState[LEFT]='1'; ReleaseMutex(chopsticks[LEFT]); // Dat dua Trai xuong
chState[RIGHT]='1'; ReleaseMutex(chopsticks[RIGHT]);// Dat dua Phai xuong
}
}
void main(){
HANDLE handles[numPhilosophers];
DWORD threadID; int i;
// khởi tạo trạng thái ban đầu, tất cả hền triết đều đang suy nghĩ.
chState[numPhilosophers]='\\0'; phState[numPhilosophers]='\\0';
for (i=0; i<numPhilosophers; i++){
chState[i]='1'; phState[i]='-';
}
for (i=0; i<numPhilosophers; i++) // trạng thái đèn hiệu
chopsticks[i]=CreateMutex(0, FALSE, 0);
printf("- Chopsticks:\\t%s\\n Philosophers:\\t%s\\n\\n", chState, phState);
for (i=0; i<numPhilosophers; i++)
// tạo tiến trình các nhà hiền triết. chạy hàm PhilosopherThread.
handles[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)PhilosopherThread,(void *)i,0,&threadID);
WaitForMultipleObjects(numPhilosophers, handles, TRUE, INFINITE);
for (i=0; i<numPhilosophers; i++) CloseHandle(chopsticks[i]);
}
lyhuyvinh- Tổng số bài gửi : 15
Join date : 19/02/2009
Re: bài toán hiền triết cùng ăn.
Bạn thật là chịu khó . Sắp thi rồi còn post bài cho các bạn
lqhlam- Tổng số bài gửi : 90
Join date : 17/03/2009
Re: bài toán hiền triết cùng ăn.
Đúng là "Đá banh còn thay đổi được tỉ số ở phút 89" !
cám ơn bạn nhìu
cám ơn bạn nhìu
phuongdtk- Tổng số bài gửi : 56
Join date : 19/02/2009
Cám ơn bạn nhìu nha
Cám ơn bạn nhìu nha
phuong.ntt-08h1010074- Tổng số bài gửi : 137
Join date : 05/05/2009
Re: bài toán hiền triết cùng ăn.
Cám ơn vì bạn đã giải thích kỹ như thế này, chúc bạn tihi tốt.
Thuy Trang- Tổng số bài gửi : 25
Join date : 22/02/2009
Re: bài toán hiền triết cùng ăn.
hahaha Thanks bạn nhiều.
caynamnho- Tổng số bài gửi : 22
Join date : 20/03/2009
Similar topics
» Thảo luận Bài 7
» Bài toán Hiền triết cùng ăn.
» Mời các bạn tham khảo code bai tuan Hiền Triết cùng ăn
» Thảo luận Bài 7
» 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.
» Mời các bạn tham khảo code bai tuan Hiền Triết cùng ăn
» Thảo luận Bài 7
» Ví dụ về DeadLock - Các bạn xem xó đúng hay không?
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