标签:
#include "stdafx.h" #include <windows.h> #include <iostream> #include <queue> #include <process.h> using namespace std; DWORD WINAPI Consumer(void*);//声明消费者函数 DWORD WINAPI Producer(void*);//声明生产者函数 #define N 10//定义缓冲区数量 /*数据结构的定义*/ struct MyData{ HANDLE m_S_Empty;// 生产者Semaphore HANDLE m_S_Full; // 消费者Semaphore HANDLE m_M_Mutex;//互斥信号量 queue<int> food; //定义共享缓冲区 bool producerfinished;//标志着生产者是否结束生产 }; int j=0;//只是为了输出方便观察线程执行次数 int main() { /*对各个信号量赋值*/ MyData mydata;//创建一个MyData数据类型的实体 mydata mydata.m_M_Mutex = CreateMutex(NULL, false, NULL);//"false"表示刚刚创建的这个信号量不 属于®¨²任何线程 mydata.m_S_Empty = CreateSemaphore(NULL, N, N, NULL);//初始计数为N mydata.m_S_Full = CreateSemaphore(NULL, 0, N, NULL);//初始计数为0 mydata.producerfinished=false;//生产者结束标志刚开始设置为false,表示没有结束 /*创建生产者和消费者线程*/ HANDLE handles[2]; handles[0] = CreateThread(NULL,0,&Producer,(void*)&mydata,0,0); handles[1] = CreateThread(NULL,0,&Consumer,(void*)&mydata,0,0); WaitForMultipleObjects(2, handles, true, INFINITE); //等待两个线程都结束才往下执行 CloseHandle(mydata.m_M_Mutex); CloseHandle(mydata.m_S_Full); CloseHandle(mydata.m_S_Empty); } /*生产者函数*/ DWORD WINAPI Producer(void* lp) { MyData * md = (MyData*)lp; for(int i =0 i < 100; i++){ WaitForSingleObject(md->m_S_Empty, INFINITE);//缓冲区有空间才可以往下 WaitForSingleObject(md->m_M_Mutex, INFINITE);//消费者没有在操作缓冲区生产者才可以执行 /*将所生产的物品放到指定的缓冲区中*/ md->food.push(1); printf("%d\t生产1个物品,共有%d个物品\t\t%d\n",j++,md->food.size(),GetCurrentThreadId());//输 出缓冲区信息以及线程信息 ReleaseMutex(md->m_M_Mutex);//释放互斥信号量 ReleaseSemaphore(md->m_S_Full, 1, NULL);//有物品的缓冲区增加一个 } md->producerfinished=true;//若出了for循环,生产者结束生产,控制消费者线程结束 return 0; } /*消费者函数*/ DWORD WINAPI Consumer(void* lp) { MyData * md = (MyData*)lp; while(!md->producerfinished){//若生产者没有结束生产,可以继续往下执行 WaitForSingleObject(md->m_S_Full,INFINITE);//若缓冲区没有空,则可以往下执行 WaitForSingleObject(md->m_M_Mutex,INFINITE);//若生产者没有在操作缓冲区,则消费则可以操作 /*消费一个物品*/ md->food.pop(); printf("%d\t消费1个物品,共有%d个物品\t\t%d\n",j++,md->food.size(),GetCurrentThreadId());// 输出缓冲区信息以及线程信息 ReleaseMutex(md->m_M_Mutex); //释放互斥信号量 ReleaseSemaphore(md->m_S_Empty,1,NULL);//空缓冲区增加一个 } return 0; }
标签:
原文地址:http://www.cnblogs.com/xs-yqz/p/5055280.html