Win32多线程学习之二(实现生产者与消费者模型)

本文探讨了并发编程的基本概念,并深入介绍了线程池的使用及其在提高程序效率方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值