C++实现生产者消费者问题详解及代码实例
4星 · 超过85%的资源 | 下载需积分: 9 | DOC格式 | 28KB |
更新于2025-01-06
| 147 浏览量 | 举报
本文档主要介绍了C++版本的生产者-消费者问题解决方案,这是一种经典的并发编程模型,常用于演示线程同步机制,特别是在多线程环境下处理共享资源的问题。生产者负责生产产品并将其放入缓冲区,而消费者则从缓冲区中取出产品进行消费。这里使用了Windows API中的互斥量(Mutex)和信号量(Semaphore)来实现线程间的协调。
首先,定义了一些关键变量:
1. `SIZE_OF_BUFFER`:表示缓冲区的容量,为10。
2. `ProductID` 和 `ConsumeID`:分别用于记录生产的产品编号和待消费的产品编号。
3. `in` 和 `out`:缓冲区的输入和输出指针,初始化为0,表示缓冲区为空。
4. `g_buffer`:一个大小为`SIZE_OF_BUFFER`的循环队列,存储产品。
5. `g_continue`:全局布尔值,用于控制程序是否继续运行,直到所有产品都被消费。
6. `g_hMutex`:互斥锁,确保同一时间只有一个线程访问缓冲区。
7. `g_hFullSemaphore` 和 `g_hEmptySemaphore`:信号量,前者在缓冲区满时使生产者等待,后者在缓冲区空时使消费者等待。
在`main`函数中,首先创建了三个互斥信号量和线程相关的句柄:
1. 通过`CreateMutex`创建互斥锁`g_hMutex`,用于保护对缓冲区的访问。
2. 通过`CreateSemaphore`创建两个信号量,`g_hFullSemaphore`表示缓冲区不满,`g_hEmptySemaphore`表示缓冲区不空。
3. 定义生产者数量(PRODUCERS_COUNT = 3),消费者数量(CONSUMERS_COUNT = 1),总线程数(THREADS_COUNT = PRODUCERS_COUNT + CONSUMERS_COUNT)。
4. 创建一个线程数组`hThreads`,用于存储所有线程的句柄,并定义生产者线程的标识符数组`producerID`。
接下来,文章会介绍如何创建生产者和消费者线程,这两个线程分别执行以下操作:
- 生产者线程(`Producer`):当缓冲区未满时,生产一个产品并增加产品ID,然后调用信号量`g_hFullSemaphore`释放资源,让其他线程有机会进入缓冲区。
- 消费者线程(`Consumer`):当缓冲区不为空时,从缓冲区中取出一个产品,减少产品ID,然后调用信号量`g_hEmptySemaphore`释放资源,允许其他线程有机会将产品放入缓冲区。
这个例子展示了如何利用C++实现线程同步,确保了在并发环境中生产者不会无限地生产产品,消费者也不会无休止地等待。通过控制生产者和消费者之间的交互,避免了死锁和资源竞争,确保了系统的稳定性和效率。
相关推荐
343 浏览量
17 浏览量
8 浏览量