请教一下,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 啥意思
而且如果对上述程序设置断点又会显示不同的结果