21xrx.com
2025-03-24 00:45:19 Monday
文章检索 我的文章 写文章
C++实现生产者消费者模式
2023-07-10 08:26:05 深夜i     14     0
C++ 生产者消费者模式 实现

生产者消费者模式是一种多线程任务处理模式,其中有多个线程同时运行,其中一部分线程被标记为“生产者”,负责生产数据,而另一部分线程被标记为“消费者”,负责处理数据。

在这种模式中,生产者向一个共享的缓冲区中插入数据,而消费者则从这个缓冲区中取出数据并进行处理。如果缓冲区已满,生产者将被暂停,直到有空间可用。同样地,如果缓冲区为空,消费者将被暂停,直到有数据产生。

C++中实现生产者消费者模式可以使用线程和同步原语来完成。以下是一个简单的示例代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mutex;
std::condition_variable cond;
std::queue<int> q;
void producer() {
  // 生产者的处理逻辑
  for (int i = 0; i < 10; i++) {
   std::lock_guard<std::mutex> lock(mutex);
   q.push(i);
   std::cout << "生产者生产了:" << i << std::endl;
   cond.notify_one();
   // 唤醒一个等待线程,例如消费者
  }
}
void consumer() {
  // 消费者的处理逻辑
  while (true) {
   std::unique_lock<std::mutex> lock(mutex);
   cond.wait(lock, [] { return !q.empty(); });
   // 等待队列不为空
   int val = q.front();
   q.pop();
   std::cout << "消费者消费了:" << val << std::endl;
  }
}
int main() {
 std::thread producer_thread(producer);
 std::thread consumer_thread(consumer);
 producer_thread.join();
 consumer_thread.join();
 return 0;
}

在这个示例中,我们定义了一个队列q来共享数据,并使用了一个互斥锁mutex来保证线程安全。在生产者函数中,我们使用一个for循环来生成10个整数并将它们插入队列中,然后使用条件变量cond通知任何一个正在等待的线程,例如消费者,队列已经有新数据可用。

在消费者函数中,我们使用一个while(true)循环来不断获取队列中的数据。首先,我们获取了一个unique_lock对象和互斥锁mutex,然后通过等待条件变量cond来检查队列是否有新数据。一旦队列不为空,我们从队列头部取出数据并进行处理。

最后,我们创建了两个线程,一个线程运行生产者函数,另一个线程运行消费者函数,并使用.join()函数来等待线程执行完毕。这样,我们就实现了一个简单的生产者消费者模式的C++程序。

  
  
下一篇: C++注释快捷键

评论区