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

你可能感兴趣的:(Win32)