21xrx.com
2024-12-23 00:37:13 Monday
登录
文章检索 我的文章 写文章
C++生产者消费者模式代码实现
2023-06-27 13:18:25 深夜i     --     --
C++ 生产者消费者模式 代码实现 多线程 缓冲区

在多线程编程中,生产者消费者模式是一种常用的并发模型,它可以有效地解决生产者和消费者之间的数据同步问题,同时还可以提高程序的运行效率和并发性。

C++语言提供了许多用于多线程编程的标准库及工具,其中就包括了实现生产者消费者模式的类和函数。下面将介绍一种使用C++标准库实现生产者消费者模式的代码实现方法。

生产者消费者模式代码实现步骤

首先,我们需要定义生产者和消费者的任务,以及它们共同处理的数据结构。在这个例子中,我们以一个大小为100的循环队列作为共享的数据结构,生产者线程的任务是向队列中添加数据,消费者线程的任务是从队列中取出数据并进行相应的处理。

其次,我们需要定义一个互斥锁和两个条件变量,它们的作用是保证生产者和消费者线程之间的同步和互斥。互斥锁用于保护共享数据结构,条件变量用于实现线程的阻塞和唤醒操作。

最后,我们需要编写生产者和消费者线程的代码,并在主函数中创建它们。在程序运行时,生产者线程向队列中添加数据,消费者线程从队列中取出数据并进行处理,同时通过互斥锁和条件变量来保证它们的同步和互斥。

代码实现示例

下面是一个使用C++标准库实现生产者消费者模式的代码示例。在这个例子中,我们使用了一个循环队列和一个互斥锁及两个条件变量,实现了一个生产者和一个消费者线程。


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <queue>

using namespace std;

mutex mtx;

condition_variable cv_producer, cv_consumer;

queue<int> q;

int count = 0;

void producer() {

  for (int i = 0; i < 100; i++) {

    unique_lock<mutex> ulock(mtx);

    while (q.size() >= 10)

      cv_producer.wait(ulock);

    q.push(count++);

    cout << "Producer: " << count-1 << endl;

    ulock.unlock();

    cv_consumer.notify_one();

  }

}

void consumer() {

  for (int i = 0; i < 100; i++) {

    unique_lock<mutex> ulock(mtx);

    while (q.empty())

      cv_consumer.wait(ulock);

    int data = q.front();

    q.pop();

    cout << "Consumer: " << data << endl;

    ulock.unlock();

    cv_producer.notify_one();

  }

}

int main() {

  thread t1(producer);

  thread t2(consumer);

  t1.join();

  t2.join();

  return 0;

}

在这个例子中,我们定义了一个循环队列q,它的最大长度为10。生产者线程通过向队列中添加数据来生产产品,消费者线程通过从队列中取出数据来消费产品。

在生产者线程中,我们首先获取了互斥锁mtx,然后使用while循环来判断队列是否已满。如果队列已满,则通过条件变量cv_producer让线程阻塞,并在释放锁之前等待唤醒信号。

如果队列未满,则将数据添加到队列中,并打印出相应的信息。然后我们释放互斥锁,通过条件变量cv_consumer向消费者线程发送唤醒信号。

在消费者线程中,我们也首先获取了互斥锁mtx,然后使用while循环来判断队列是否为空。如果队列为空,则通过条件变量cv_consumer让线程阻塞,并在释放锁之前等待唤醒信号。

如果队列非空,则从队列中取出数据并打印出相应的信息。然后我们释放互斥锁,通过条件变量cv_producer向生产者线程发送唤醒信号。

在主函数中,我们创建了两个线程t1和t2,它们分别执行生产者和消费者线程的任务。最后我们等待两个线程都运行结束,然后退出程序。

总结

生产者消费者模式是一种常用的并发模型,它可以有效地解决多线程编程中的数据同步问题。在C++标准库中,我们可以使用互斥锁和条件变量来实现生产者消费者模式,这样可以更加简便和高效地进行多线程编程。

  
  

评论区

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