21xrx.com
2024-09-20 00:41:23 Friday
登录
文章检索 我的文章 写文章
C++多线程编程:生产者与消费者模式的实现
2023-07-01 06:12:37 深夜i     --     --
C++ 多线程编程 生产者 消费者 模式实现

C++是一种高效、灵活的编程语言,它的多线程编程能力也在不断提高。其中,生产者和消费者是一种常见的多线程模式,它可以实现线程间的协作和任务分离,提高程序的效率和可维护性。

生产者与消费者模式的实现主要分为两个部分:生产者和消费者。生产者负责生成数据并将其放入共享区域,消费者负责从共享区域中获取数据并执行相应的操作。

在C++多线程编程中,可以通过使用互斥锁和条件变量来实现生产者和消费者模式。互斥锁可以保证在任何时刻只有一个线程可以访问共享资源,从而避免了多个线程同时修改数据的问题。条件变量可以用来阻塞线程并等待资源的释放。

下面是一个C++多线程生产者和消费者模式的实现示例:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

using namespace std;

const int BUFFER_SIZE = 10; // 缓冲区大小

int buffer[BUFFER_SIZE];   // 缓冲区

int front = 0, rear = 0;   // 缓冲区队头和队尾指针

mutex mtx;          // 互斥锁

condition_variable not_full; // 条件变量,表示缓冲区不满

condition_variable not_empty;// 条件变量,表示缓冲区不空

void produce(int id) {

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

    unique_lock<mutex> lock(mtx); // 加锁

    not_full.wait(lock, [] { return rear != front && (rear+1)%BUFFER_SIZE != front;}); // 阻塞直到缓冲区不满

    buffer[rear] = i; // 生产数据

    rear = (rear+1) % BUFFER_SIZE; // 更新队尾指针

    cout << "producer " << id << " produced " << i << endl;

    not_empty.notify_all(); // 唤醒消费者线程

    lock.unlock(); // 解锁

  }

}

void consume(int id) {

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

    unique_lock<mutex> lock(mtx); // 加锁

    not_empty.wait(lock, [] return rear != front; ); // 阻塞直到缓冲区不空

    int val = buffer[front]; // 消费数据

    front = (front+1) % BUFFER_SIZE; // 更新队头指针

    cout << "consumer " << id << " consumed " << val << endl;

    not_full.notify_all(); // 唤醒生产者线程

    lock.unlock(); // 解锁

  }

}

int main() {

  thread t1(produce, 1);

  thread t2(produce, 2);

  thread t3(consume, 1);

  thread t4(consume, 2);

  t1.join();

  t2.join();

  t3.join();

  t4.join();

  return 0;

}

这个示例中,定义了一个缓冲区和两个互斥锁条件变量。在每个生产者和消费者线程中,通过使用条件变量`not_full`和`not_empty`进行阻塞和唤醒。当缓冲区满了时,生产者使用`not_full.wait(lock, []{...})`进行等待,当缓冲区不满时被唤醒;当缓冲区为空时,消费者使用`not_empty.wait(lock, []{...})`进行等待,当缓冲区不空时被唤醒。

生产者在生产数据和更新队尾指针之后,通过`not_empty.notify_all()`唤醒所有消费者;消费者在消费数据和更新队头指针之后,通过`not_full.notify_all()`唤醒所有生产者。

通过使用互斥锁和条件变量,生产者与消费者模式可以实现线程间的协作,实现任务分离,提高程序的效率和可维护性。在实际开发中,除了互斥锁和条件变量外,也可以使用其他同步机制来实现生产者与消费者模式,如信号量、监视器等。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章