码迷,mamicode.com
首页 > 其他好文 > 详细

说的风格的

时间:2015-12-17 22:25:39      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!