Win32多线程学习之二(实现生产者与消费者模型)
#include <Windows.h>#include <stdlib.h>#include <stdio.h>#include <process.h>#include <time.h>#include <list> #define MUTEX(mutex) WaitForSingleObject(mutex, INFINITE);#define RELEASE_MUTEX(mutex) ReleaseMutex(mutex); #define P(sem) WaitForSingleObject(sem, INFINITE);#define V(sem) ReleaseSemaphore(sem, 1, NULL); #define CONSUMER_COUNT 10#define PRODUCER_COUNT 5 HANDLE mutex;HANDLE emptySem;HANDLE fullSem;::std::list<int> gList; void initialize(){ mutex = CreateMutex(NULL, false, TEXT("mutex")); emptySem = CreateSemaphore(NULL, 0, 10, TEXT("empty")); fullSem = CreateSemaphore(NULL, 10, 10, TEXT("full")); srand((unsigned int)time(NULL));} int main(){ initialize(); VOID ConsumerThread(VOID* ); VOID ProducerThread(VOID* ); for (int i = 0; i < PRODUCER_COUNT; ++i) { _beginthread(ProducerThread, 0, NULL); } for (int i = 0; i < CONSUMER_COUNT; ++i) { _beginthread(ConsumerThread, 0, NULL); } Sleep(3600*1000); return 0;} VOID ConsumerThread(VOID* argu){ while(true) { P(emptySem); MUTEX(mutex); printf("Pop a random number %d\n", *gList.rbegin()); gList.pop_back(); RELEASE_MUTEX(mutex); V(fullSem); }} VOID ProducerThread(VOID* argu){ while(true) { P(fullSem); MUTEX(mutex); int random = rand(); gList.push_front(random); printf("Push a random number: %d\n", random); RELEASE_MUTEX(mutex); V(emptySem); }}