21xrx.com
2025-06-30 14:50:21 Monday
文章检索 我的文章 写文章
C++11 下的生产者消费者模型
2023-07-04 18:50:21 深夜i     20     0
C++11 生产者 消费者 模型 多线程

在C++11中,我们可以利用条件变量(condition variables)和互斥锁(mutex)实现生产者-消费者模型。在这个模型中,生产者(producer)生产数据并存储到缓冲区中,而消费者(consumer)从缓冲区中读取数据进行消费。这样就可以实现多线程间的数据传输,提高程序的性能。

在这种模型中,使用互斥锁来控制线程对共享资源的访问。一个互斥锁同一时刻只能被一个线程持有,其他线程必须等待,直到该线程释放互斥锁。使用条件变量可以让线程按照一定规则等待或唤醒。这样就可以确保生产者和消费者在某些条件下一起工作,而不是仅仅依靠线程的运行。

下面是一个简单的生产者-消费者模型的示例代码:

#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
using namespace std;
mutex mtx;
condition_variable cv;
queue<int> buffer;
const int buffer_size = 20;
void producer() {
  for (int i = 0; i < 50; i++) {
    unique_lock<mutex> lck(mtx);
    if (buffer.size() >= buffer_size) {
      cv.wait(lck);
    }
    buffer.push(i);
    cout << "Producer produced: " << i << endl;
    cv.notify_all();
  }
}
void consumer() {
  while (true) {
    unique_lock<mutex> lck(mtx);
    if (buffer.empty()) {
      cv.wait(lck);
    }
    int data = buffer.front();
    buffer.pop();
    cout << "Consumer consumed: " << data << endl;
    cv.notify_all();
  }
}
int main() {
  vector<thread> thrds;
  thrds.push_back(thread(producer));
  thrds.push_back(thread(consumer));
  for (int i = 0; i < 2; i++) {
    thrds[i].join();
  }
  return 0;
}

在这个示例中,我们创建了一个固定长度的缓冲区。生产者线程使用while循环不断地向缓冲区添加数据,当缓冲区达到最大长度时,使用条件变量等待通知。当消费者线程从缓冲区中获取数据时,如果缓冲区为空,使用条件变量等待通知。需要注意的是,在获取数据和添加数据时都需要加锁,确保只有一个线程能够访问缓冲区,避免数据出现冲突。

总结一下,在C++11中,生产者-消费者模型可以使用条件变量和互斥锁实现。使用互斥锁可以保证线程同步,而使用条件变量可以让线程等待或唤醒,实现有序的数据传输。开发者可以使用这些工具来编写具有高效性能的多线程程序,提升程序的可靠性和稳定性。

  
  

评论区