21xrx.com
2025-03-19 12:58:41 Wednesday
文章检索 我的文章 写文章
C++多线程生产者消费者模型
2023-07-03 17:18:31 深夜i     6     0
C++ 多线程 生产者 消费者 模型

C++多线程生产者消费者模型,是指在多线程环境下,采用生产者和消费者两种角色的模型。在该模型中,生产者负责生成数据,放入共享数据区,而消费者则负责从共享数据区中取出数据,进行处理。

在实现该模型时,需要注意以下几点:

1.线程同步。在多线程环境下,为确保线程安全,需要使用互斥锁(Mutex)进行线程同步。

2.信号量。在该模型中,需要使用信号量(Semaphore)实现线程的同步、互斥和并发。

3.缓冲区。生产者将数据放入共享数据区,消费者从共享数据区中取出数据,需要使用缓冲区,在缓冲区内进行数据的交换。

在C++中,可以使用STL库中的queue容器来实现缓冲区,使用mutex和condition_variable类来实现线程同步和唤醒。

以下是一个简单的C++多线程生产者消费者模型的示例代码:

#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
using namespace std;
queue<int> data;        // 共享数据区
mutex mtx;           // 互斥锁
condition_variable cv_pro;   // 生产者信号量
condition_variable cv_con;   // 消费者信号量
const int kMaxSize = 10;    // 缓冲区大小
void Producer()
{
  for (int i = 0; i < kMaxSize; ++i)
  {
    unique_lock<mutex> lock(mtx);
    while (data.size() == kMaxSize)   // 缓冲区满
    {
      cout << "Buffer full! Producer waits..." << endl;
      cv_con.notify_all();      // 唤醒消费者线程
      cv_pro.wait(lock);       // 生产者等待
    }
    data.push(i);            // 向缓冲区中添加数据
    cout << "Produce: " << i << endl;
    cv_con.notify_all();        // 唤醒消费者线程
  }
}
void Consumer()
{
  while (true)
  {
    unique_lock<mutex> lock(mtx);
    while (data.empty())        // 缓冲区空
    {
      cout << "Buffer empty! Consumer waits..." << endl;
      cv_pro.notify_all();      // 唤醒生产者线程
      cv_con.wait(lock);       // 消费者等待
    }
    int num = data.front();       // 从缓冲区中取出数据
    data.pop();
    cout << "Consume: " << num << endl;
    cv_pro.notify_all();        // 唤醒生产者线程
  }
}
int main()
{
  thread pro(Producer);          // 创建生产者线程
  thread con(Consumer);          // 创建消费者线程
  pro.join();
  con.join();
  return 0;
}

以上代码中,我们使用了互斥锁和信号量来确保生产者和消费者的顺序执行,在共享数据区加锁之后,使用condition_variable类来进行线程的等待和唤醒。

总的来说,C++多线程生产者消费者模型的实现并不复杂,只要在实现过程中注意线程同步和缓冲区,就能够顺利地构建起一个高效的多线程程序。

  
  

评论区