Giải thích về code thực thi sản xuất và tiêu thụ
Trang 1 trong tổng số 1 trang
Giải thích về code thực thi sản xuất và tiêu thụ
#include //khai báo
#include//khai báo
#include//khai báo
#define BUFFER_SIZE 10 //Định nghĩa hàm
int buffer[BUFFER_SIZE];//khai báo
int in=0;//khai báo
int out=0;//khai báo
int nextProduced=1;//khai báo
void Producer(){
while (1){
// ... (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());lấy luồng hiện hành, SuspendThread hàm API dùng để tạo ngưng 1 luồng.
}
}
void Consumer(){
int nextConsumed;//khai báo
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 nếu out đang nằm ở cuối mảng thì out sẽ trở về đầu mảng
// ... (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,thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này tạm dừng trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main() //Hàm chính {
HANDLE ProducerHandle1, ProducerHandle2; // biến Handle chứa mục quản nhà SX
HANDLE ConsumerHandle1, ConsumerHandle2; // biến Handle chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // chứa ID nhà sx
DWORD ConsumerID1, ConsumerID2; // chứa ID nhà tiêu thụ
// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID1); //khởi tạo nhà SX 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 là trạng thái luôn luôn ngủ
ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2); // tương tự
// tao 2 luồng tiêu thụ trong trang thái ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //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 luôn luôn thức.
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2); //tương tự
while(1){
printf("\n- Nhấn P/p để sản xuất,0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case '0': /// giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1); // làm luồng chính trễ 1 mili giây trước khi in bộ đệm
ShowBuffer(); //Đưa kết quả ra màn hình
}
}
#include
#include
#define BUFFER_SIZE 10 //Định nghĩa hàm
int buffer[BUFFER_SIZE];//khai báo
int in=0;//khai báo
int out=0;//khai báo
int nextProduced=1;//khai báo
void Producer(){
while (1){
// ... (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());lấy luồng hiện hành, SuspendThread hàm API dùng để tạo ngưng 1 luồng.
}
}
void Consumer(){
int nextConsumed;//khai báo
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 nếu out đang nằm ở cuối mảng thì out sẽ trở về đầu mảng
// ... (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,thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này tạm dừng trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main() //Hàm chính {
HANDLE ProducerHandle1, ProducerHandle2; // biến Handle chứa mục quản nhà SX
HANDLE ConsumerHandle1, ConsumerHandle2; // biến Handle chứa mục quản nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // chứa ID nhà sx
DWORD ConsumerID1, ConsumerID2; // chứa ID nhà tiêu thụ
// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID1); //khởi tạo nhà SX 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 là trạng thái luôn luôn ngủ
ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2); // tương tự
// tao 2 luồng tiêu thụ trong trang thái ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //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 luôn luôn thức.
ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2); //tương tự
while(1){
printf("\n- Nhấn P/p để sản xuất,0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case '0': /// giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1); // làm luồng chính trễ 1 mili giây trước khi in bộ đệm
ShowBuffer(); //Đưa kết quả ra màn hình
}
}
HuynhThanhLy(I12A)- Tổng số bài gửi : 42
Join date : 17/02/2012
Age : 35
Đến từ : Quảng Ngãi
Similar topics
» Giải thich code cho vấn đề sản xuất tieu thụ
» Giai thich code cho van de san xuat tieu thu
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Cảm ơn bạn DaoMinhTri đã giải thích cho minh hiểu phần code bây giờ mình hiểu được phần code của sản xuất tiêu thụ
» Giai thich code cho van de san xuat tieu thu
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Cảm ơn bạn DaoMinhTri đã giải thích cho minh hiểu phần code bây giờ mình hiểu được phần code của sản xuất tiêu thụ
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