Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Giải thich code cho vấn đề sản xuất tieu thụ

2 posters

Go down

Giải thich code cho vấn đề sản xuất tieu thụ Empty Giải thich code cho vấn đề sản xuất tieu thụ

Bài gửi  lekhanhhoa(I22B) 30/4/2013, 12:56

#include <stdio.h>
#include <conio.h>
#include <windows.h> // lập trình đa luồng đồng hành, sử dụng được hàm win32 API

#define BUFFER_SIZE 10
 
int buffer[BUFFER_SIZE]; // định nghĩa một buffer có số khoang chứa là 10
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra

int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên

void Producer(){ // hàm sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthred: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}

void Consumer(){
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây
nextConsumed=buffer[out]; //sản phẩm ở vị trí buffer out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về 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, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này 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(){
HANDLE ProducerHandle1, ProducerHandle2; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ

DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng 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);
//tạo 1 luồng sản xuất, luồng này sẽ lấy giá trị trả về của hàm Producer và được ép kiểu (LPTHREAD_START_ROUTINE), số 0 tiếp theo chỉ ra hàm Producer ko có tham biến, số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1);
//0: luồng tiêu thụ vận hành ngay, ko ngủ

ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sx cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}

lekhanhhoa(I22B)

Tổng số bài gửi : 31
Join date : 24/03/2013

Về Đầu Trang Go down

Giải thich code cho vấn đề sản xuất tieu thụ Empty Re: Giải thich code cho vấn đề sản xuất tieu thụ

Bài gửi  TranQuocLoc(I22A) 22/6/2013, 15:05

Ở lệnh "ru ngủ" hệ thống Sleep(GetTickCount()%5000) có lẽ nên cộng thêm 1 giá trị hằng để tránh trường hợp xấu nhất Sleep(0). Thanks your post!

Admin
- "Thức suốt đêm" để ôn thi có thể là một thực tế ! Hôm sau mà thi tốt thì Sleep(0) đâu có phải là "trường hợp xấu nhất" !
- Nói thế thôi, cứ ngủ cho tốt, nhưng nhớ đặt báo thức, vì mai thi Ca 1 !

TranQuocLoc(I22A)

Tổng số bài gửi : 10
Join date : 09/03/2013
Age : 34
Đến từ : Bà Rịa- Vũng Tàu

Về Đầu Trang Go down

Giải thich code cho vấn đề sản xuất tieu thụ Empty Re: Giải thich code cho vấn đề sản xuất tieu thụ

Bài gửi  TranQuocLoc(I22A) 23/6/2013, 00:15

TranQuocLoc(I22A) đã viết:Ở lệnh "ru ngủ" hệ thống Sleep(GetTickCount()%5000) có lẽ nên cộng thêm 1 giá trị hằng để tránh trường hợp xấu nhất Sleep(0). Thanks your post!

Admin
- "Thức suốt đêm" để ôn thi có thể là một thực tế ! Hôm sau mà thi tốt thì Sleep(0) đâu có phải là "trường hợp xấu nhất" !
- Nói thế thôi, cứ ngủ cho tốt, nhưng nhớ đặt báo thức, vì mai thi Ca 1 !

^^ Thank you! Sir!

TranQuocLoc(I22A)

Tổng số bài gửi : 10
Join date : 09/03/2013
Age : 34
Đến từ : Bà Rịa- Vũng Tàu

Về Đầu Trang Go down

Giải thich code cho vấn đề sản xuất tieu thụ Empty Re: Giải thich code cho vấn đề sản xuất tieu thụ

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết