新手救助,请大侠帮忙看看程序

我们开始学操作系统了,学到生产者与消费问题,小弟在设罢随机函数时,不知道是不是与线程发生冲突了,怎么也运行不了,各位大侠帮帮忙,看看哪里有问题,哪些方面有待改进,谢谢哈:
#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;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值