您的位置:首页 > 其它

说的风格的

2015-12-17 20:55 176 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: