简单的生产者消费者-(windows下)
2013-08-20 12:37 居安 阅读(331) 评论(0) 收藏 举报// Produce_Consume.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include <process.h>//_beginthreadex的头文件
#define BUFFER_SIZE 10
HANDLE hMutex;
HANDLE hNotFull;
HANDLE hNotEmpty;
struct prodcons 
{
  int buffer[BUFFER_SIZE];
  int getpos, putpos; 
};
typedef struct prodcons PrCon;
PrCon *pContainer;
unsigned __stdcall Producer(void *mArgclist)
{
 while(1)
 {
  WaitForSingleObject(hNotFull, INFINITE);
  WaitForSingleObject(hMutex,INFINITE);//
  pContainer->buffer[pContainer->putpos] = pContainer->putpos;
  pContainer->putpos = (pContainer->putpos+1)%BUFFER_SIZE;
  
  ReleaseMutex(hMutex); 
  ReleaseSemaphore(hNotEmpty , 1 , NULL);
 }
 
 return 1;
}
unsigned __stdcall Consumer(void *mArgclist)
{
 
 int data;
 while(1)
 {
  WaitForSingleObject(hNotEmpty, INFINITE);
  WaitForSingleObject(hMutex,INFINITE);//
  data = pContainer->buffer[pContainer->getpos];
  pContainer->getpos = (pContainer->getpos+1)%BUFFER_SIZE;
  
  ReleaseMutex(hMutex); 
  ReleaseSemaphore(hNotFull , 1, NULL);
  printf("GetData=%d\n" , data);
 }
 
 return 1;
}
int main(void)
{
 HANDLE hProThread , hConThread;
 unsigned int ProducerId , ConsumerId;
 PrCon Container;
 
 Container.putpos = Container.getpos=0;
 pContainer = &Container;
 hNotFull = CreateSemaphore(NULL, 10, 10, _T("NotFull"));
 hNotEmpty = CreateSemaphore(NULL, 0, 10, _T("NotEmpty"));
 hMutex = CreateMutex(NULL, FALSE, _T("Mutex"));  
 if (GetLastError() == ERROR_ALREADY_EXISTS)
 { 
  // 如果已有互斥量存在则释放句柄并复位互斥量 
  CloseHandle(hMutex); 
  hMutex = NULL;  
  return FALSE; 
 } 
 hProThread = (HANDLE)_beginthreadex(NULL,0,&Producer,NULL,NULL , &ProducerId);
 hConThread = (HANDLE)_beginthreadex(NULL,0,&Consumer,NULL,NULL , &ConsumerId);
 printf("enter any key to exit...\n");
 getchar();
}
                    
                
                
            
        
浙公网安备 33010602011771号