您的位置:首页 > 其它

Win32信号量实现生产者消费者模型

2011-09-14 21:05 381 查看
生产者消费者模型简介

1.如果共享的buffer中有空位,则生产者生产产品,放到空位中;

2.如果共享的buffer中有产品,则消费者消费产品;

使用win32简单实现 多生产者/多消费者 模型如下

#include <Windows.h>
#include <process.h>
#include <iostream>

using namespace std;
HANDLE hProducter;
HANDLE hConsumer;

int g_in = 0; // 初始生产产品的放置位置
int g_out = 0; // 初始消费产品的读取位置
const int MAX_NUM = 100;
int g_empty = MAX_NUM; // 初始空位数量
int g_full = 0;  // 初始产品数量
int g_products[MAX_NUM];

DWORD WINAPI Productor( LPVOID pParameter)
{
int* pNo = static_cast<int*>(pParameter);

while(1)
{
WaitForSingleObject(hProducter, INFINITE);
if(g_empty > 0)
{
--g_empty;

g_in %= MAX_NUM;
g_products[g_in] = g_in;
printf("produce id %d pos %d value %d\n", *pNo, g_in, g_products[g_in]);
++g_in;

++g_full;
}
ReleaseSemaphore(hProducter, 1, NULL);
Sleep(1000);
}

return 1;
}

DWORD WINAPI Consumer( LPVOID pParameter)
{
int* pNo = static_cast<int*>(pParameter);

while(1)
{
WaitForSingleObject(hConsumer, INFINITE);
if(g_full > 0)
{
--g_full;

g_out %= MAX_NUM;
printf("consume id %d pos %d value %d\n", *pNo, g_out, g_products[g_out]);
++g_out;

++g_empty;
}
ReleaseSemaphore(hConsumer, 1, NULL);
Sleep(1000);
}
return 1;
}

int main()
{
hProducter = CreateSemaphore(NULL, 1, 1, NULL);
hConsumer = CreateSemaphore(NULL, 1, 1, NULL);

int ProductorThreadIds[3];
int ConsumerThreadIds[3];

for(int i = 0; i < 3; ++i)
{
ConsumerThreadIds[i] = i+1;
CreateThread(NULL, 0, Consumer, &ConsumerThreadIds[i], NULL, NULL);
}

for(int i = 0; i < 3; ++i)
{
ProductorThreadIds[i] = i+1;
CreateThread(NULL, 0, Productor, &ProductorThreadIds[i], NULL, NULL);
}

Sleep(10000);
return 0;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: