Bạn nào biết xin giải thích dùm mình phần code của hàm main() thực thi bài toán SXTT
Trang 1 trong tổng số 1 trang
Bạn nào biết xin giải thích dùm mình phần code của hàm main() thực thi bài toán SXTT
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;// sản xuất
int out=0;// tiêu thụ
int nextProduced=1;
HANDLE semEmpty, semFull;
CRITICAL_SECTION critSec;
void Producer(){
while (1){
// San xuat (nextProduced)
WaitForSingleObject(semEmpty, INFINITE);
EnterCriticalSection(&critSec);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;// số dư phép chia trong sản suất
LeaveCriticalSection(&critSec);
ReleaseSemaphore (semFull, 1, NULL);
SuspendThread(GetCurrentThread());
//( luồng hiện hành chuyển sang trạng thái kết thúc,trả về mục quản của hiện hành)
}
}
void Consumer(void * c){
int nextConsumed;
while (1){
WaitForSingleObject(semFull, INFINITE);
EnterCriticalSection(&critSec);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE; ;// số dư phép chia trong tiêu thụ
LeaveCriticalSection(&critSec);
ReleaseSemaphore (semEmpty, 1, NULL);
if ((int)c == 3) // Luong so 3
SuspendThread(GetCurrentThread());
else
Sleep(GetTickCount()%5000);
;// ngủ 1 khoảng thời gian cho trước là hàm để nhận số mili giây trôi qua từ khi hệ điều hành khởi động cho đến khi gọi hàm này
}
void ShowBuffer(){
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0;i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0;i<BUFFER_SIZE-1;i++) printf("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;
HANDLE ConsumerHandle1, ConsumerHandle2, ConsumerHandle3;
DWORD ProducerID1, ProducerID2;
DWORD ConsumerID1, ConsumerID2, ConsumerID3;
;// số dư phép chia trong sản suất trong trạng thái tiêu thụ
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
//ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
ConsumerHandle3=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,(void *)3,4,&ConsumerID3);
while(1)
{
printf("\n- Nhan P/p de san xuat, C/c de tieu thu, nhan 0 de ket thuc:");
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1);
break;
case 'p':
ResumeThread(ProducerHandle2);
break;
case 'C':
case 'c':
ResumeThread(ConsumerHandle3);
break;
case '0':
printf("\n");
CloseHandle(semEmpty);
CloseHandle(semFull);
DeleteCriticalSection(&critSec);
return 0;
}
EnterCriticalSection(&critSec);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;// sản xuất
int out=0;// tiêu thụ
int nextProduced=1;
HANDLE semEmpty, semFull;
CRITICAL_SECTION critSec;
void Producer(){
while (1){
// San xuat (nextProduced)
WaitForSingleObject(semEmpty, INFINITE);
EnterCriticalSection(&critSec);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;// số dư phép chia trong sản suất
LeaveCriticalSection(&critSec);
ReleaseSemaphore (semFull, 1, NULL);
SuspendThread(GetCurrentThread());
//( luồng hiện hành chuyển sang trạng thái kết thúc,trả về mục quản của hiện hành)
}
}
void Consumer(void * c){
int nextConsumed;
while (1){
WaitForSingleObject(semFull, INFINITE);
EnterCriticalSection(&critSec);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE; ;// số dư phép chia trong tiêu thụ
LeaveCriticalSection(&critSec);
ReleaseSemaphore (semEmpty, 1, NULL);
if ((int)c == 3) // Luong so 3
SuspendThread(GetCurrentThread());
else
Sleep(GetTickCount()%5000);
;// ngủ 1 khoảng thời gian cho trước là hàm để nhận số mili giây trôi qua từ khi hệ điều hành khởi động cho đến khi gọi hàm này
}
void ShowBuffer(){
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0;i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0;i<BUFFER_SIZE-1;i++) printf("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;
HANDLE ConsumerHandle1, ConsumerHandle2, ConsumerHandle3;
DWORD ProducerID1, ProducerID2;
DWORD ConsumerID1, ConsumerID2, ConsumerID3;
;// số dư phép chia trong sản suất trong trạng thái tiêu thụ
semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);
InitializeCriticalSection(&critSec);
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1);
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID2);
//ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1);
//ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID2);
ConsumerHandle3=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,(void *)3,4,&ConsumerID3);
while(1)
{
printf("\n- Nhan P/p de san xuat, C/c de tieu thu, nhan 0 de ket thuc:");
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1);
break;
case 'p':
ResumeThread(ProducerHandle2);
break;
case 'C':
case 'c':
ResumeThread(ConsumerHandle3);
break;
case '0':
printf("\n");
CloseHandle(semEmpty);
CloseHandle(semFull);
DeleteCriticalSection(&critSec);
return 0;
}
EnterCriticalSection(&critSec);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}
NguyenThiHongYen(I12A)- Tổng số bài gửi : 20
Join date : 20/02/2012
Similar topics
» Bạn nào biết xin giải thích dùm mình phần code của hàm main() thực thi bài toán SXTT Phần này mình chưa hiểu lắm
» 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ụ
» Thảo luận Bài 5
» Giải thích về code thực thi sản xuất và tiêu thụ
» Phân biệt 2 giải thuật MQS và MFQS. Cho ví dụ minh họa.
» 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ụ
» Thảo luận Bài 5
» Giải thích về code thực thi sản xuất và tiêu thụ
» Phân biệt 2 giải thuật MQS và MFQS. Cho ví dụ minh họa.
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