读书人

Win32多线程学习之二(兑现生产者与消

发布时间: 2012-10-07 17:28:51 作者: rapoo

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);    }}

读书人网 >编程

热点推荐