Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
+9
NguyenAnhNgoc56 (102C)
nguyenvandung(i91C)
nguyenphicuong (i92c)
NguyenThiKimThanh (102C)
NguyenMinhNhuY(102C)
TranVuLam(102C)
dovanbinh (102C)
MaiThePhuong (102C)
NguyenVietHung (102C)
13 posters
Trang 1 trong tổng số 1 trang
Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Buổi học hôm 23/3 vừa rồi Thầy có nói bài toán Sản xuất và Tiêu thụ là bài toán khó và quan trọng xuyên suốt môn học Hệ Điều Hành.Có 2 tiến trình là tiến trình Sản Xuất và tiến trình Tiêu Thụ.
Bạn nào hiểu được và phát biểu đầy đủ bài toán này thì post lên cùng tham khảo nhé!
Thứ 4 tuần sau học tiếp nè! Phải tập trung thôi.
NguyenVietHung (102C)- Tổng số bài gửi : 48
Join date : 21/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
khó thiệt, phải ráng nghe giảng vào lần tới, rồi lĩnh hội được gì đưa lên cùng mọi người chia sẻ và tìm hiểu thêm
MaiThePhuong (102C)- Tổng số bài gửi : 80
Join date : 16/02/2011
Age : 34
Đến từ : Bình thuận
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
* Sản xuất chuyên tạo sản phẩm mới và để vào kho chứa.
*Tiêu thụ chuyên lấy sản phẩm từ kho chứa ra để sử dụng.
Bài toán Sản xuất -Tiêu thụ trên có 2 vấn đề cần giải quyết :
*Làm sao để phần tử Sản xuất và Tiêu thụ không được tranh chấp nhau khi truy xuất kho chứa sản phẩm.
*Làm sao để đồng bộ tốc độ thi hành của 2 phần tử để chúng có thể hoạt động tốt theo thời gian, không gây khủng hoảng thừa hay khủng hoảng thiếu.
dovanbinh (102C)- Tổng số bài gửi : 139
Join date : 17/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
MaiThePhuong (102C) đã viết:khó thiệt, phải ráng nghe giảng vào lần tới, rồi lĩnh hội được gì đưa lên cùng mọi người chia sẻ và tìm hiểu thêm
Chúng ta mỗi người hiểu được những gì cùng post lên để hiểu và làm được bài tập này.Nghe nói khó và có trong thi đó bạn! hi hi
NguyenVietHung (102C)- Tổng số bài gửi : 48
Join date : 21/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Bài này hình như ở lớp I9C2 có đó,mấy bữa mình vô đó tìm tài liệu nên thấy thì phải
TranVuLam(102C)- Tổng số bài gửi : 127
Join date : 16/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Sao mình vô tìm hoài không thấy vây ta,cũng đang cần bài này
NguyenMinhNhuY(102C)- Tổng số bài gửi : 54
Join date : 16/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Tối hôm qua đi học nhưng mình vẫn chưa hiểu rõ mấy.bạn nào hiểu rõ post lên để cùng nhau tìm hiểu nha.thanksTranVuLam(102C) đã viết:Bài này hình như ở lớp I9C2 có đó,mấy bữa mình vô đó tìm tài liệu nên thấy thì phải
NguyenVietHung (102C)- Tổng số bài gửi : 48
Join date : 21/02/2011
Bài toán Sản xuất - Tiêu thụ
Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
NguyenThiKimThanh (102C)- Tổng số bài gửi : 46
Join date : 17/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
Thanks bạn nha!
dovanbinh (102C)- Tổng số bài gửi : 139
Join date : 17/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Thanks! code chi tiết lắm.dễ hiểu.NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
NguyenVietHung (102C)- Tổng số bài gửi : 48
Join date : 21/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
thanks ban
nguyenphicuong (i92c)- Tổng số bài gửi : 34
Join date : 16/03/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Cảm ơn bạn
nguyenvandung(i91C)- Tổng số bài gửi : 43
Join date : 06/05/2010
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
thank bạn, để mình đem code về chạy thử coi
NguyenAnhNgoc56 (102C)- Tổng số bài gửi : 41
Join date : 17/02/2011
Phát biểu bài toán sản xuất tiêu thụ với thuật giải phù hợp. Trình bày giải thuật
Phát biểu bài toán:
• Giả sử có Bộ nhớ đệm (Buffer) bao gồm nhiều khoang (Items) được tiến trình Producer lần lượt đưa các sản phẩm S1, S2,... vào.
• Tiến trình Consumer lần lượt lấy sản phẩm ra theo đúng thứ tự.
• Công việc của Producer phải đồng bộ với Consumer: Không được đưa sản phẩm vào khi Buffer đầy, Không được lấy ra khi chưa có.
Trình bày giải thuật:
dovanbinh (102C)- Tổng số bài gửi : 139
Join date : 17/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Thanks các bạn nha.
QuachVanLoc_I92C- Tổng số bài gửi : 64
Join date : 23/09/2010
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
Thank bạn nhiều. để mình chạy thử rồi debug mới hiểu được.
NGUYENVANMANH(102C)- Tổng số bài gửi : 68
Join date : 23/02/2011
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
NGUYENVANMANH(102C) đã viết:NguyenThiKimThanh (102C) đã viết:Tham khảo code sản xuất và tiêu thụ, các bạn cho ý kiến nha
- Code:
#define BUFFER_SIZE 10 //số lượng khoang chứa
int buffer[BUFFER_SIZE]; //bộ nhớ đệm size 10 p.tử
int in=0; //con trỏ tới vị trí trống kế tiếp
int out=0; //con trỏ tới vị trí trống tiếp theo
int nextProduced=1; //tạo 1 sản phẩm được sản xuất kế tiếp
//Hàm sản xuất:
void Producer()
{
while (1)
{
//Quá trình tạo ra 1 sản phẩm
// ... San xuat (nextProduced
//vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm
while(((in+1)%BUFFER_SIZE)==out);
//khi vòng lặp while kết thúc =>có 1 chỗ trống để chèn sản phẩm vào
buffer[in]=nextProduced++; //chèn sản phẩm tại vị trí in vô ngăn chứa, sản phẩm được sản xuất
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
//hàm SuspendThread dùng để tạo ngưng 1 luồng hiện hành
SuspendThread(GetCurrentThread());
}
}
//Hàm tiêu thụ:
void Consumer()
{
int nextConsumed;
while (1)
{
// vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
while(in==out);
//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm tại vị trí out ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm
// ... Tieu thu (nextConsumed)--> quá trình tiêu thụ sàn phẩm
//hàm Sleep đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm
//đếm số mili giây trong giờ hiện tại % 5000, hết thời gian thực hiện while kế tiếp
Sleep(GetTickCount()%5000);
}
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2;//biến HANDLE chứa mục quản nhà sản xuất
HANDLE ConsumerHandle1, ConsumerHandle2;// biến HANDLE chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2, ConsumerID1, ConsumerID2;//chứa ID nhà sản xuất và nhà tiêu thụ
//khởi tạo nhà sản xuất với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//khởi tạo nhà tiêu thụ với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
//nhấn phím P=Producing
case 'P':
// đánh thức Producer lúc này đang ở trạng thái ngủ
ResumeThread(ProducerHandle1);
break;
//nhấn phím p=Producing
case 'p': ResumeThread(ProducerHandle2); break;
//giải phóng Producer và Consumer khỏi bộ nhớ
case '0':
{
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
}
//ngừng 1 khoảng thời gian nhất định để nhà sản xuất vừa được đánh thức kịp hoàn tất 1 chu trình công việc
Sleep(1);
//show kết quả sau khi sản xuất tiêu thụ
ShowBuffer();
}
}
Thank bạn nhiều. để mình chạy thử rồi debug mới hiểu được.
Bạn chụp hình từng bước cho mọi người cùng xem luôn nhé! Cám ơn bạn đã đóng góp.
NguyenVietHung (102C)- Tổng số bài gửi : 48
Join date : 21/02/2011
Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Thank ban nhiu ha!
TranDinhHuan (102C)- Tổng số bài gửi : 34
Join date : 17/02/2011
Age : 35
Re: Bài toán Sản xuất - Tiêu thụ (Trong Bài 4 - Quản lí tiến trình) post đây để dễ theo dõi !!!
Bài code này của bạn đúng chuẩn luôn. Cảm ơn bạn nhiều nhé vì còn giải thích code rõ ràng nữa.
nguyenthingoan (i92c)- Tổng số bài gửi : 39
Join date : 16/02/2011
Similar topics
» Thảo luận Bài 7
» Phát biểu bài toán Sản xuất-Tiêu thụ với giải pháp đồng bộ hóa công việc các tiến trình sãn xuất-tiêu thụ bằng 3 đèn hiệu
» Thảo luận Bài 5
» Thảo luận Bài 5
» Thảo luận Bài 4
» Phát biểu bài toán Sản xuất-Tiêu thụ với giải pháp đồng bộ hóa công việc các tiến trình sãn xuất-tiêu thụ bằng 3 đèn hiệu
» Thảo luận Bài 5
» Thảo luận Bài 5
» Thảo luận Bài 4
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