Về các đoạn code sản xuất và tiêu thụ
3 posters
Trang 1 trong tổng số 1 trang
Về các đoạn code sản xuất và tiêu thụ
Hổm đi học nhưng mình vẫn chưa hiểu lắm? Bạn nào có thể giải thích sơ lại từng dòng ở 2 hàm của chương trình sản xuất và tiêu thục không? Mình nghĩ nhiều bạn khác cũng muốn hiểu rõ hơn về 2 hàm này. Chúng ta cùng bàn luận nào.
Nguyen Dinh Mai Huy(I82C)- Tổng số bài gửi : 58
Join date : 15/09/2010
Re: Về các đoạn code sản xuất và tiêu thụ
Hàm sản xuất:
void Producer(){
while (1){
// ... San xuat (nextProduced) --> quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> 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
//khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; //chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread()); //GetCurrentThread() -->lấy luồng hiện hành, SuspendThread --> hàm API dùng để tạo ngưng 1 luồng
}
}
Hàm tiêu thụ:
void Consumer(){
int nextConsumed;
while (1){
while(in==out); // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
//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 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
Sleep(GetTickCount()%5000); // hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm, ngủ trong khoảng GetTickCount() % 5000
}
}
Hàm Main
int main(){
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT
DWORD ProducerID1, ProducerID2; //chứa ID NSX và NTT
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1); //khởi tạo NSX 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ủ
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1); //khởi tạo NTT 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
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch()){
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;
}
Sleep(1); //ngừng 1 khoảng thời gian nhất định
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}
Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).
void Producer(){
while (1){
// ... San xuat (nextProduced) --> quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> 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
//khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; //chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread()); //GetCurrentThread() -->lấy luồng hiện hành, SuspendThread --> hàm API dùng để tạo ngưng 1 luồng
}
}
Hàm tiêu thụ:
void Consumer(){
int nextConsumed;
while (1){
while(in==out); // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
//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 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
Sleep(GetTickCount()%5000); // hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm, ngủ trong khoảng GetTickCount() % 5000
}
}
Hàm Main
int main(){
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT
DWORD ProducerID1, ProducerID2; //chứa ID NSX và NTT
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1); //khởi tạo NSX 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ủ
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1); //khởi tạo NTT 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
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch()){
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;
}
Sleep(1); //ngừng 1 khoảng thời gian nhất định
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}
Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).
vi_hung_i92- Tổng số bài gửi : 21
Join date : 16/09/2010
Đến từ : Tp.Hồ Chí Minh
Re: Về các đoạn code sản xuất và tiêu thụ
Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).
hihi, cám ơn thầy đã xác nhận bài giải thích của bạn, em sẽ học kĩ phần này để chuẩn bị kiểm tra.
Nguyen Dinh Mai Huy(I82C)- Tổng số bài gửi : 58
Join date : 15/09/2010
Re: Về các đoạn code sản xuất và tiêu thụ
Cam on ban vi_hung_i92 da co nhung loi giai thich that chinh xac cho bai nay.
Cam on thay da co loi nhan xet va danh gia ve cau tra loi cua ban vi_hung_i92.
Em se chep bai nay de on tap.
Cam on thay da co loi nhan xet va danh gia ve cau tra loi cua ban vi_hung_i92.
Em se chep bai nay de on tap.
vi_hung_i92 đã viết:Hàm sản xuất:
void Producer(){
while (1){
// ... San xuat (nextProduced) --> quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> 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
//khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; //chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread()); //GetCurrentThread() -->lấy luồng hiện hành, SuspendThread --> hàm API dùng để tạo ngưng 1 luồng
}
}
Hàm tiêu thụ:
void Consumer(){
int nextConsumed;
while (1){
while(in==out); // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
//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 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
Sleep(GetTickCount()%5000); // hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm, ngủ trong khoảng GetTickCount() % 5000
}
}
Hàm Main
int main(){
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT
DWORD ProducerID1, ProducerID2; //chứa ID NSX và NTT
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1); //khởi tạo NSX 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ủ
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1); //khởi tạo NTT 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
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch()){
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;
}
Sleep(1); //ngừng 1 khoảng thời gian nhất định
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}
Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).
tinlv_i91c- Tổng số bài gửi : 39
Join date : 09/04/2010
Đến từ : Quang Ngai
Similar topics
» Code vấn đề sản xuất tiêu thụ
» CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
» code sản xuất tiêu thụ
» code sản xuất và tiêu thụ
» Thảo luận Bài 5
» CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
» code sản xuất tiêu thụ
» code sản xuất và tiêu thụ
» Thảo luận Bài 5
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