| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 681 人关注过本帖
标题:请教一下,c++,生产者与消费者,多线程
只看楼主 加入收藏
panlihui
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-3-31
收藏
 问题点数:0 回复次数:0 
请教一下,c++,生产者与消费者,多线程
#include <iostream>
#include <stdlib.h>
#include <STDIO.H>
#include <windows.h>

using namespace std;

typedef int semaphore;                          /* 信号量是一种特殊的整型变量 */     
const int SIZE_OF_BUFFER = 5 ;                                //缓冲区长度
const unsigned short PRODUCERS_COUNT = 2;       //生产者的个数
const unsigned short CONSUMERS_COUNT = 3;       //消费者的个数

DWORD producers[PRODUCERS_COUNT] ; //生产者线程的标识符                       
DWORD consumers[CONSUMERS_COUNT] ;//消费者线程的标识符

const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; //总的线程数

/**
*定义信号量
*/
HANDLE mutex ;                               //互斥信号量  
HANDLE full ;                             //表示放有产品的缓冲区数,其初值为0  
HANDLE empty ;                            //表示可供使用的缓冲区数,其初值为N  

/**
*定义共享缓冲区
*/
semaphore buffer[SIZE_OF_BUFFER];  

/**
*定义生产者和消费者使用的指针  
*/
int in = 0 ;
int out = 0 ;

int productNum = 0 ;

DWORD WINAPI Producer(LPVOID) ;
DWORD WINAPI Consumer(LPVOID) ;

int main(int argc, char *argv[])
{
    //创建Mutex和Semaphore
    mutex = CreateMutex(NULL,FALSE,NULL);
    full = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
    empty = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);
     
     
    HANDLE PVThreads[THREADS_COUNT];     //各线程的handle  
     
     //创建生产者线程
     for (int i=0;i<PRODUCERS_COUNT;i++){
          PVThreads[i] = CreateThread(NULL,0,Producer,NULL,0,&producers[i]);
          if (PVThreads[i] == NULL) break;
     }
     //创建消费者线程  
     for (int i=0;i<CONSUMERS_COUNT;i++){
           PVThreads[PRODUCERS_COUNT+i]
                =CreateThread(NULL,0,Consumer,NULL,0,&consumers[i]);
            if (PVThreads[i]==NULL) break;
     }
     
    bool isContinue = true ;
    while(isContinue)
    {  
          if(getchar()){  //按回车后终止程序运行
               isContinue = false;  
           }
    }
    system("PAUSE");     
    return 0;
}

void enBuffer(int pos)
{
    cout<<"正在生产产品..."<<endl ;
    Sleep(2000) ;
    buffer[pos] = -1 ;
    productNum++ ;
    cout<<"生产完成!    已生产"<<productNum<<"个产品,并将新产品放在了缓冲区位置:"<<pos<<endl ;
}

void deBuffer(int pos)
{
    cout<<"正在消费产品..."<<endl ;
    Sleep(1000) ;
    buffer[pos] = -2 ;
    productNum-- ;
    cout<<"已消费在缓冲区位置:"<<pos<<"的产品,缓冲区剩余空间:"<<SIZE_OF_BUFFER-productNum<<endl ;
    cout<<endl ;  
}

/**
*生产者  
*/
DWORD WINAPI Producer(LPVOID lpParam )
{
    while(1)
    {
        WaitForSingleObject(empty,INFINITE);  // P(empty) 生产者信号量 -1  
        WaitForSingleObject(mutex,INFINITE);  // P(mutex) 获取线程间互斥信号  
        enBuffer(in) ;
        Sleep(1000) ;
        in = (in+1)%SIZE_OF_BUFFER ;
        ReleaseMutex(mutex);                  // V(mutex) 释放线程间互斥信号  
        ReleaseSemaphore(full,1,NULL);        // V(full) 消费者信号量 +1  
         
    }
    return 0;
}

/**
*消费者  
*/
DWORD WINAPI Consumer(LPVOID lpPara)
{
    while(1)
    {
        WaitForSingleObject(full,INFINITE)== WAIT_ABANDONED ;        //P(full) 消费者信号量-1  
        WaitForSingleObject(mutex,INFINITE);       //P(mutex) 获得线程间互斥信号  
        deBuffer(out) ;
        Sleep(1000) ;
        out = (out+1)%SIZE_OF_BUFFER ;
        ReleaseMutex(mutex);                       //V(mutex) 释放线程间互斥信号  
        ReleaseSemaphore(empty,1,NULL);            //V(empty) 生产者信号量+1  
         
    }
    return 0;
}
就是在上面的程序中,运行起来时,为什么为
怎么会先有三个生产产品,后面是消费过程,后面就是一个生产过程与消费过程交替出现
还有,  WaitForSingleObject(full,INFINITE)== WAIT_ABANDONED ;        //P(full) 消费者信号量-1  中WAIT_ABANDONED 啥意思
而且如果对上述程序设置断点又会显示不同的结果
搜索更多相关主题的帖子: include 消费者 多线程 生产者 缓冲区 
2014-05-14 16:00
快速回复:请教一下,c++,生产者与消费者,多线程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021716 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved