21xrx.com
2024-11-05 17:33:04 Tuesday
登录
文章检索 我的文章 写文章
C++实现生产者消费者线程
2023-07-04 22:06:10 深夜i     --     --
生产者 消费者 线程 C++实现

在多线程编程中,生产者消费者模式是一个重要的设计模式。该模式将一个生产者和一个或多个消费者组合在一起,生产者生成产品并将其放入一个共享的缓冲区中,然后消费者从该缓冲区中取出产品并进行处理。生产者和消费者必须在不互斥的情况下访问共享的缓冲区。

C++作为一种高级编程语言,在实现生产者消费者线程方面提供了很多支持。下面是一个简单的示例,演示了如何使用C++实现一个生产者消费者线程。

首先,需要定义一个共享缓冲区,它将用于存储产品:


#include <mutex>

#include <queue>

#include <condition_variable>

template<typename T>

class Buffer {

public:

  void put(T&& item) {

    std::unique_lock<std::mutex> lock(m);

    buffer.push(std::move(item));

    lock.unlock();

    cv.notify_one();

  }

  T get() {

    std::unique_lock<std::mutex> lock(m);

    while (buffer.empty()) {

      cv.wait(lock);

    }

    T item = std::move(buffer.front());

    buffer.pop();

    return item;

  }

private:

  std::queue<T> buffer;

  std::mutex m;

  std::condition_variable cv;

};

在上面的代码中,使用了互斥锁和条件变量,以确保生产者和消费者不会同时访问缓冲区。当生产者向缓冲区中添加产品时,首先获取锁,然后将产品推入队列,接着释放锁,最后通知等待的消费者。当消费者从缓冲区中获取产品时,首先获取锁,然后在队列为空时等待条件变量唤醒,接着获取队头的产品,释放锁,最后返回产品。

接下来,可以定义生产者线程和消费者线程:


#include <thread>

#include <iostream>

Buffer<int> buffer;

void producer() {

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

    buffer.put(i);

  }

}

void consumer() {

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

    std::cout << buffer.get() << std::endl;

  }

}

int main() {

  std::thread t1(producer);

  std::thread t2(consumer);

  t1.join();

  t2.join();

}

在上面的代码中,创建了一个整型类型的缓冲区,并定义了生产者和消费者函数。生产者函数将0~4共五个数字添加到缓冲区中,而消费者函数则将缓冲区中的数字取出并打印到控制台。在主函数中创建了两个线程,一个用于生产者,一个用于消费者,并且使用join()方法按照顺序等待线程执行完成。

通过上述代码,可以在C++中轻松地实现生产者消费者线程,并且可以通过增加或减少线程数量,以及缓冲区大小,灵活地控制程序的性能和效率。

  
  

评论区

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