我们开始学操作系统了,学到生产者与消费问题,小弟在设罢随机函数时,不知道是不是与线程发生冲突了,怎么也运行不了,各位大侠帮帮忙,看看哪里有问题,哪些方面有待改进,谢谢哈:
#include"stdlib.h"
#include"stdio.h"
#include"time.h"
#include"windows.h"
//int rand();//产生随机的时间
int CriticalSection={2};//临界区变量设置
static HANDLE hS1=NULL,hS2=NULL;//把生产消费的信号量设为全局变量
static HANDLE hProducer=NULL,hConsumer=NULL;
DWORD WINAPI producer(HANDLE p);
DWORD WINAPI consumer(HANDLE p);
void main()
{
void chioce(void);
printf("生产-消费者问题为:/n");
printf("由随机函数生成选择变量/n");
chioce();
LPCRITICAL_SECTION hCriticalSection;//定义临界区对象的地址
CRITICAL_SECTION Critical;//定义临界区
hCriticalSection=&Critical;
InitializeCriticalSection(hCriticalSection);//初始化临界区
hS1=CreateSemaphore(NULL,1,3,NULL);//创建信号量
hS2=CreateSemaphore(NULL,1,3,NULL);
while(1){
hProducer=CreateThread(NULL,0,producer,(PVOID)hCriticalSection,CREATE_SUSPENDED,NULL);//创建生产者线程
hConsumer=CreateThread(NULL,0,consumer,(PVOID)hCriticalSection,CREATE_SUSPENDED,NULL);//创建消费者线程
}
}
void produce()
{ printf("判断临界处所处状态/n");
printf("临界区为: Empty/n");
printf("生产者生产产品: product A/n");
CriticalSection=2;//produce
//Sleep(rand());//挂起随机时间
}
DWORD WINAPI producer(HANDLE p)
{ WaitForSingleObject(hS1,INFINITE);//相当于P原语
EnterCriticalSection((LPCRITICAL_SECTION)p);//进入临界区
produce();//调用produce函数
LeaveCriticalSection((LPCRITICAL_SECTION)p);//离开临界区
ReleaseSemaphore(hS2,1,NULL);//相当于V原语
return 0;
}
void consume()
{ printf("判断临界处所处状态/n");
printf("临界区为: Full/n");
printf("消费者消费产品: Consume A/n");
CriticalSection=0;//consume
//Sleep(rand());
}
DWORD WINAPI consumer(HANDLE p)
{
WaitForSingleObject(hS2,INFINITE);//相当于P原语
EnterCriticalSection((LPCRITICAL_SECTION)p);//进入临界区
consume();//调用consume函数
LeaveCriticalSection((LPCRITICAL_SECTION)p);//离开临界区
ReleaseSemaphore(hS1,1,NULL);//相当于V原语
return 1;
}
void chioce(void)
{
srand((unsigned)time(NULL));
if(rand()%2==0)
{ printf("生产者优先,进行生产活动/n");
ResumeThread(hProducer);
}
else
{ printf("消费者优先,进行消费活动/n");
ResumeThread(hConsumer);
}
return;
}
#include"stdlib.h"
#include"stdio.h"
#include"time.h"
#include"windows.h"
//int rand();//产生随机的时间
int CriticalSection={2};//临界区变量设置
static HANDLE hS1=NULL,hS2=NULL;//把生产消费的信号量设为全局变量
static HANDLE hProducer=NULL,hConsumer=NULL;
DWORD WINAPI producer(HANDLE p);
DWORD WINAPI consumer(HANDLE p);
void main()
{
void chioce(void);
printf("生产-消费者问题为:/n");
printf("由随机函数生成选择变量/n");
chioce();
LPCRITICAL_SECTION hCriticalSection;//定义临界区对象的地址
CRITICAL_SECTION Critical;//定义临界区
hCriticalSection=&Critical;
InitializeCriticalSection(hCriticalSection);//初始化临界区
hS1=CreateSemaphore(NULL,1,3,NULL);//创建信号量
hS2=CreateSemaphore(NULL,1,3,NULL);
while(1){
hProducer=CreateThread(NULL,0,producer,(PVOID)hCriticalSection,CREATE_SUSPENDED,NULL);//创建生产者线程
hConsumer=CreateThread(NULL,0,consumer,(PVOID)hCriticalSection,CREATE_SUSPENDED,NULL);//创建消费者线程
}
}
void produce()
{ printf("判断临界处所处状态/n");
printf("临界区为: Empty/n");
printf("生产者生产产品: product A/n");
CriticalSection=2;//produce
//Sleep(rand());//挂起随机时间
}
DWORD WINAPI producer(HANDLE p)
{ WaitForSingleObject(hS1,INFINITE);//相当于P原语
EnterCriticalSection((LPCRITICAL_SECTION)p);//进入临界区
produce();//调用produce函数
LeaveCriticalSection((LPCRITICAL_SECTION)p);//离开临界区
ReleaseSemaphore(hS2,1,NULL);//相当于V原语
return 0;
}
void consume()
{ printf("判断临界处所处状态/n");
printf("临界区为: Full/n");
printf("消费者消费产品: Consume A/n");
CriticalSection=0;//consume
//Sleep(rand());
}
DWORD WINAPI consumer(HANDLE p)
{
WaitForSingleObject(hS2,INFINITE);//相当于P原语
EnterCriticalSection((LPCRITICAL_SECTION)p);//进入临界区
consume();//调用consume函数
LeaveCriticalSection((LPCRITICAL_SECTION)p);//离开临界区
ReleaseSemaphore(hS1,1,NULL);//相当于V原语
return 1;
}
void chioce(void)
{
srand((unsigned)time(NULL));
if(rand()%2==0)
{ printf("生产者优先,进行生产活动/n");
ResumeThread(hProducer);
}
else
{ printf("消费者优先,进行消费活动/n");
ResumeThread(hConsumer);
}
return;
}