#include <windows.h>
#include <iostream>
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
int g_buffer[SIZE_OF_BUFFER]; //缓冲区
unsigned short in =0;
unsigned short out =0;
HANDLE g_hMutex;
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
bool g_continue = true; //控制程序结束
int in_number = 0;
int out_number =0;
DWORD WINAPI Write(LPVOID lpPara);
DWORD WINAPI Read(LPVOID lpPara);
using namespace std;
int main()
{
//创建互斥信号
g_hMutex= CreateMutex(NULL,FALSE,NULL);
// g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
// g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
const unsigned short WRITE_COUNT =1; //写的个数
const unsigned short READ_COUNT =1; //读的个数
const unsigned short THREADS_COUNT =WRITE_COUNT+READ_COUNT;//总线程个数
HANDLE hThreads[THREADS_COUNT]; //线程句柄
DWORD Write_Thread_ID[WRITE_COUNT]; //写线程的标识符
DWORD Read_Thread_ID[READ_COUNT]; //读线程的标识符
//创建写线程
for(int i=0;i<WRITE_COUNT;i++)
{
hThreads[i]=CreateThread(NULL,0,Write,NULL,0,&Write_Thread_ID[i]);
}
//创建读线程
for(int j=0;j<READ_COUNT;j++)
{
hThreads[WRITE_COUNT+j]=CreateThread(NULL,0,Read,NULL,0,&Read_Thread_ID[i]);
}
//回车后终止运行
while(g_continue)
{
if(getchar())
{
g_continue =false;
}
}
return 0;
}
//写一个字符
void Write_number()
{
cout<<"we write the number is : "<<in_number<<endl;
//把字符放入缓冲区
g_buffer[in]=in_number;
in=(in+1)%SIZE_OF_BUFFER;
in_number++;
}
//读一个字符
void Get_number()
{
out_number =g_buffer[out];
out=(out+1)%SIZE_OF_BUFFER;
cout<<"we get the number is : "<<out_number<<endl;
}
//写线程
DWORD WINAPI Write(LPVOID lpPara)
{
while(g_continue)
{
// WaitForSingleObject(g_hFullSemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Write_number();
Sleep(10);
ReleaseMutex(g_hMutex);
// ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
}
return 0;
}
//读线程
DWORD WINAPI Read(LPVOID lpPara)
{
while(g_continue)
{
// WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);
Get_number();
Sleep(10);
ReleaseMutex(g_hMutex);
// ReleaseSemaphore(g_hFullSemaphore,1,NULL);
}
return 0;
}