zoukankan      html  css  js  c++  java
  • 说的风格的

    #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	生产1个物品,共有%d个物品		%d
    ",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	消费1个物品,共有%d个物品		%d
    ",j++,md->food.size(),GetCurrentThreadId());//
    
    输出缓冲区信息以及线程信息  
    ReleaseMutex(md->m_M_Mutex); //释放互斥信号量 
      ReleaseSemaphore(md->m_S_Empty,1,NULL);//空缓冲区增加一个 
    }  
    return 0; 
    } 
  • 相关阅读:
    [网络流24题]餐巾计划问题
    [网络流24题]方格取数问题
    [网络流24题]试题库问题
    [网络流24题]最长递增子序列问题
    [网络流24题]圆桌问题
    [网络流24题]魔术球问题
    51nod1462 树据结构
    51nod1053 最大M子段和 V2
    51nod1026 矩阵中不重复的元素 V2
    BZOJ3832: [Poi2014]Rally
  • 原文地址:https://www.cnblogs.com/xs-yqz/p/5055280.html
Copyright © 2011-2022 走看看