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.

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

Go down

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 Empty 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

Bài gửi  NguyenThiHongYen(I12A) 3/5/2012, 05:03

#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);
}
}
Surprised

NguyenThiHongYen(I12A)

Tổng số bài gửi : 20
Join date : 20/02/2012

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