C++实现生产者消费者问题详解及代码实例

4星 · 超过85%的资源 | 下载需积分: 9 | DOC格式 | 28KB | 更新于2025-01-06 | 147 浏览量 | 93 下载量 举报
2 收藏
本文档主要介绍了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++实现线程同步,确保了在并发环境中生产者不会无限地生产产品,消费者也不会无休止地等待。通过控制生产者和消费者之间的交互,避免了死锁和资源竞争,确保了系统的稳定性和效率。

相关推荐