操作系统 实验五
生产者-消费者问题1
使用互斥区和事件解决生产者消费者问题
#include<stdio.h>
#include<process.h>
#include<windows.h>
const int END_PRODUCE_NUMBER=10;
int g_Buffer;
CRITICAL_SECTION g_cs;
HANDLE g_hEventBufferEmpty,g_hEventBufferFull;
unsigned int __stdcall ProducerThreadFun(PVOID pM)
{
int i;
for(i=1;i<=END_PRODUCE_NUMBER;i++)
{
WaitForSingleObject(g_hEventBufferEmpty,INFINITE);
EnterCriticalSection(&g_cs);
g_Buffer=i;
printf("生产者将数据%d放入缓冲区\n",i);
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferFull);
}
return 0;
}
unsigned int __stdcall ConsumerThreadFun(PVOID pM)
{
volatile int flag=1;
while(flag)
{
WaitForSingleObject(g_hEventBufferFull,INFINITE);
EnterCriticalSection(&g_cs);
printf("--消费者从缓冲区中取数据%d\n",g_Buffer);
if(g_Buffer==END_PRODUCE_NUMBER)
flag=0;
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferEmpty);
Sleep(10);
}
return 0;
}
int main()
{
HANDLE hThread[2];
printf("\t 生产者消费者问题<->\n");
InitializeCriticalSection(&g_cs);
g_hEventBufferEmpty=CreateEvent(NULL,FALSE,TRUE,NULL);
g_hEventBufferFull=CreateEvent(NULL,FALSE,FALSE,NULL);
hThread[0]=(HANDLE)_beginthreadex(NULL,0,ProducerThreadFun,NULL,0,NULL);
hThread[1]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
WaitForMultipleObjects(2,hThread,TRUE,INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(g_hEventBufferEmpty);
CloseHandle(g_hEventBufferFull);
DeleteCriticalSection(&g_cs);
Sleep(10000);
return 0;
}
生产者-消费者问题2
#include<stdio.h>
#include<process.h>
#include<windows.h>
#define END_PRODUCE_NUMBER 8
#define BUFFER_SIZE 4
int g_Buffer[BUFFER_SIZE];
int g_i,g_j;
CRITICAL_SECTION g_cs;
HANDLE g_hSemaphoreBufferEmpty,g_hSemaphoreBufferFull;
unsigned int __stdcall ProducerThreadFun(PVOID pM)
{
int i;
for(i=1;i<=END_PRODUCE_NUMBER;i++)
{
WaitForSingleObject(g_hSemaphoreBufferEmpty,INFINITE);
EnterCriticalSection(&g_cs);
g_Buffer[g_i]=i;
printf("生产者在缓冲池第%d个缓冲区中投放数据%d\n",g_i,g_Buffer[g_i]);
g_i=(g_i+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
}
printf("生产者完成任务,线程结束运行\n");
return 0;
}
unsigned int __stdcall ConsumerThreadFun(PVOID pM)
{
while(1)
{
WaitForSingleObject(g_hSemaphoreBufferFull,INFINITE);
EnterCriticalSection(&g_cs);
printf("编号为%d的消费者从第%d个缓冲区取出数据%d\n",
GetCurrentThreadId(),g_j,g_Buffer[g_j]);
if(g_Buffer[g_j]==END_PRODUCE_NUMBER)
{
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
break;
}
g_j=(g_j+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
Sleep(50);
ReleaseSemaphore(g_hSemaphoreBufferEmpty,1,NULL);
}
printf("编号为%d的消费者受到通知,线程结束运行\n",GetCurrentThreadId());
return 0;
}
int main()
{
HANDLE hThread[3];
int i;
printf("\t生产者消费者问题<二>\n");
InitializeCriticalSection(&g_cs);
g_hSemaphoreBufferEmpty=CreateSemaphore(NULL,4,4,NULL);
g_hSemaphoreBufferFull=CreateSemaphore(NULL,0,4,NULL);
g_i=0;
g_j=0;
memset(g_Buffer,0,sizeof(g_Buffer));
hThread[0]=(HANDLE)_beginthreadex(NULL,0,ProducerThreadFun,NULL,0,NULL);
hThread[1]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
hThread[2]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
for(i=0;i<3;i++)
CloseHandle(hThread[i]);
CloseHandle(g_hSemaphoreBufferEmpty);
CloseHandle(g_hSemaphoreBufferFull);
DeleteCriticalSection(&g_cs);
Sleep(10000);
return 0;
}
引发中断?
线程下标相同,地址冲突。
Producer与Consumer在代码中的数量不对应