多线程练习----生产者消费者

#include<windows.h> #include<iostream> using namespace std; const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度 unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区下标 int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列 CRITICAL_SECTION g_cs; //用于线程间的互斥 HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程 int main() { //创建各个互斥信号 InitializeCriticalSection( &g_cs); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //调整下面的数值,可以发现,当生产者个数多于消费者个数时, //生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; //生产者的个数 const unsigned short CONSUMERS_COUNT = 1; //消费者的个数 //总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; //各线程的handle HANDLE hThreads[PRODUCERS_COUNT]; //创建生产者线程 for(int i = 0; i < PRODUCERS_COUNT; ++i) { hThreads[i] = CreateThread(NULL,0,Producer,NULL,0,NULL); if(hThreads[i] == NULL) return -1; } //创建消费者线程 for( i=0; i < CONSUMERS_COUNT; ++i) { hThreads[PRODUCERS_COUNT+i] = CreateThread(NULL,0,Consumer,NULL,0,NULL); if (hThreads[i]==NULL) return -1; } Sleep(100000); DeleteCriticalSection(&g_cs); return 0; } //生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce() { cerr << "Producing " << ++ProductID << " ... "; cerr << "Succeed " << endl; } //把新生产的产品放入缓冲区 void Append() { cerr << "Appending a product ... "; g_buffer[in] = ProductID; in = (in+1) % SIZE_OF_BUFFER; cerr << "Succeed " << endl; //输出缓冲区当前的状态 for (int i=0; i < SIZE_OF_BUFFER; ++i){ cout << i << ": " << g_buffer[i]; if(i==in) cout << " <-- 生产 "; if(i==out) cout << " <-- 消费 "; cout << endl; } } //从缓冲区中取出一个产品 void Take() { cerr << "Taking a product ... "; ConsumeID = g_buffer[out]; out = (out+1)%SIZE_OF_BUFFER; cerr << "Succeed " << endl; //输出缓冲区当前的状态 for (int i=0;i <SIZE_OF_BUFFER;++i){ cout << i << ": " << g_buffer[i]; if (i==in)cout << " <-- 生产 "; if (i==out)cout << " <-- 消费 "; cout << endl; } } //消耗一个产品 void Consume() { cerr << "Consuming " <<ConsumeID<<" ... " << "Succeed " << endl; } //生产者 DWORD WINAPI Producer(LPVOID lpPara) { while(1){ WaitForSingleObject(g_hFullSemaphore,INFINITE); EnterCriticalSection(&g_cs); Produce(); Append(); Sleep(1500); LeaveCriticalSection(&g_cs); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); } return 0; } //消费者 DWORD WINAPI Consumer(LPVOID lpPara) { while(1){ WaitForSingleObject(g_hEmptySemaphore,INFINITE); EnterCriticalSection(&g_cs); Take(); Consume(); Sleep(1500); LeaveCriticalSection(&g_cs); ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值