Windowns操作系统:生产者消费者模型

任务:有10个生产者 10 个消费者

需要总共生产100个产品

每生产一件消费一件

生产100件生产者退出

消费100件消费者退出

分析:

分别创建10个生产者 10个消费者线程

生产者线程函数:

生产产品,全局变量++,最开始10个消费者处于阻塞

生产者每生产一个,释放一个信号

消费者每收到一个信号就消费一个产品

因为基于有限制个数去执行任务 所以我们采用信号量

 

下面请看详细代码:

#include <QCoreApplication>
#include <windows.h>
#include <queue>
#include <process.h>
#include <iostream>
using namespace std;


CRITICAL_SECTION m_s;
HANDLE hSemaphore = CreateSemaphoreA(0,0,100,0);
HANDLE hMudex = CreateMutexA(0,0,0);


int g_Num = 0;
std::queue<int> que;
unsigned __stdcall ProThreadProc(void* lpvoid)
{
    while(1)
    {
       WaitForSingleObject(hMudex,INFINITE);
        if(g_Num >= 100)
            break;
        g_Num++;
        que.push(g_Num);
        ReleaseMutex(hMudex);
        ReleaseSemaphore(hSemaphore,1,0);
    }
    return 0;
}
unsigned __stdcall CusThreadProc(void* lpvoid)
{
    while(1)
    {
      WaitForSingleObject(hSemaphore,INFINITE);

        WaitForSingleObject(hMudex,INFINITE);
        if(que.empty())
            break;
        cout << que.front() << endl;
        que.pop();
        ReleaseSemaphore(hSemaphore,1,0);
    }
    return 0;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    InitializeCriticalSection(&m_s);
    //创建10个生产者线程
    for(int i = 0; i < 10; i++)
    {
        HANDLE hProThread = (HANDLE)_beginthreadex(0,0,&ProThreadProc,0,0,0);
        if(!hProThread)
        {
            CloseHandle(hProThread);
            hProThread = nullptr;
        }
    }
    //创建10个消费者线程
    for(int i = 0; i < 10; i++)
    {
        HANDLE hCusThread = (HANDLE)_beginthreadex(0,0,&CusThreadProc,0,0,0);
        if(!hCusThread)
        {
            CloseHandle(hCusThread);
            hCusThread = nullptr;
        }
    }
    return a.exec();
}

 输出:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值