#include <windows.h>
#include <process.h>
#include <iostream>
#define BUFFER_SIZE 10
#define MAXNUM 3
using namespace std;
int buffer[BUFFER_SIZE];
int r_count = 0;
int w_count = 0;
CRITICAL_SECTION cs;
HANDLE Read_Semaphore, Write_Semaphore;//读,写信号量
void Write_Thread(PVOID param)
{
for (int i = 1; i <= MAXNUM; i++)
{
//等待空闲缓冲区
WaitForSingleObject(Write_Semaphore, INFINITE);
//互斥访问缓冲区
EnterCriticalSection(&cs);
buffer[w_count] = i;
printf("第%d个缓冲区,存放数据:%d\n",w_count,i);
w_count = (w_count + 1) % BUFFER_SIZE;
LeaveCriticalSection(&cs);
//告诉消费者有数据进入
ReleaseSemaphore(Read_Semaphore,1,NULL);
}
}
void Read_Thread(LPVOID param)
{
while (true)
{
//等待缓冲区里有数据
WaitForSingleObject(Read_Semaphore, INFINITE);
EnterCriticalSection(&cs);
if(r_count != -1)
printf("从第%d缓冲区取出数据,%d\n",r_count,buffer[r_count]);
else break;
if (buffer[r_count] == MAXNUM)
{
//提醒其他线程结束
LeaveCriticalSection(&cs);
//其他线程的结束标识
r_count = -1;
ReleaseSemaphore(Read_Semaphore,1,NULL);
break;
}
r_count = (r_count + 1) % BUFFER_SIZE;
LeaveCriticalSection(&cs);
Sleep(10);
ReleaseSemaphore(Write_Semaphore,1,NULL);
}
}
int main()
{
InitializeCriticalSection(&cs);
Write_Semaphore = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, NULL);
Read_Semaphore = CreateSemaphore(NULL,0,BUFFER_SIZE,NULL);
memset(buffer,0 ,sizeof(buffer));
HANDLE Thread[3];
Thread[0] = (HANDLE)_beginthread( Write_Thread, 0, NULL);
Thread[1] = (HANDLE)_beginthread(Read_Thread, 0, NULL);
Thread[2] = (HANDLE)_beginthread(Read_Thread,0, NULL);
WaitForMultipleObjects(3, Thread, TRUE, INFINITE);
for (int i = 0; i < 3 ;i++)
CloseHandle(Thread[1]);
CloseHandle( Write_Semaphore);
CloseHandle( Write_Semaphore);
DeleteCriticalSection(&cs);
return 0;
}
信号量解决生产者,消费者问题
最新推荐文章于 2023-12-23 21:52:08 发布