Win32信号量实现生产者消费者模型
2013-06-17 10:38
411 查看
转自:http://blog.csdn.net/webscaler/article/details/6775957
生产者消费者模型简介
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;
};
生产者消费者模型简介
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;
};
相关文章推荐
- Win32信号量实现生产者消费者模型
- 【Linux】线程总结:线程同步 -互斥锁,条件变量,信号量实现多生产者多消费者模型
- 利用多线程和信号量,互斥量实现的经典的生产者与消费者模型
- 【Windows】用信号量实现生产者-消费者模型
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段
- 信号量实现环形buff下多生产者多消费者模型
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段 .
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段
- 信号量实现环形buff下多生产者多消费者模型
- 两个信号量实现生产者消费者模型
- 信号量实现生产者消费者问题
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Linux相互排斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- 使用semaphore实现生产者-消费者简单模型
- Queue 实现生产者消费者模型(实例讲解)
- 消费者-生产者问题---进程的实现信号量
- 生产者-消费者模型(自定义类 与函数 2种实现方式)
- JS实现经典生产者消费者模型
- 信号量实现生产者消费者问题 window linux