21xrx.com
2024-09-20 00:55:46 Friday
登录
文章检索 我的文章 写文章
C++实现生产者消费者模式
2023-06-24 14:03:45 深夜i     --     --
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++程序。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复