21xrx.com
2024-06-03 06:12:01 Monday
登录
文章检索 我的文章 写文章
C++多线程生产者消费者模型
2023-07-03 17:18:31 深夜i     --     --
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++多线程生产者消费者模型的实现并不复杂,只要在实现过程中注意线程同步和缓冲区,就能够顺利地构建起一个高效的多线程程序。

  
  

评论区

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