#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多线程学习之二(实现生产者与消费者模型)
最新推荐文章于 2022-09-14 23:23:35 发布