21xrx.com
2024-11-22 02:22:08 Friday
登录
文章检索 我的文章 写文章
C++11 下的生产者消费者模型
2023-07-04 18:50:21 深夜i     --     --
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中,生产者-消费者模型可以使用条件变量和互斥锁实现。使用互斥锁可以保证线程同步,而使用条件变量可以让线程等待或唤醒,实现有序的数据传输。开发者可以使用这些工具来编写具有高效性能的多线程程序,提升程序的可靠性和稳定性。

  
  

评论区

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