21xrx.com
2024-11-08 21:13:03 Friday
登录
文章检索 我的文章 写文章
C++生产者消费者模型实现
2023-07-13 04:20:38 深夜i     --     --
C++ 生产者 消费者 模型 实现

生产者消费者模型是一种处理并发的经典模型,它基于一个共享的有限缓冲区,生产者向缓冲区里放入数据,消费者从缓冲区里取出数据并进行相应的处理。在本文中,我们将介绍如何使用 C++ 实现生产者消费者模型。

实现生产者消费者模型需要涉及到线程的使用,因此我们需要包含 C++ 标准库中的头文件“thread”和“mutex”。其中“thread”头文件提供了线程的相关功能,而“mutex”头文件则提供了互斥量的功能。

首先,我们需要定义一个共享的有限缓冲区。在本例中,我们定义了一个名为 buffer 的全局数组,用于存储生产者生产的数据。缓冲区的大小为 10。

int buffer[10];

int index = 0;

接着,我们创建一个线程安全的队列,用于实现缓冲区的控制。为了确保缓冲区的线程安全,我们需要使用互斥量进行锁定。

std::queue queue;

std::mutex mutex;

然后,我们创建两个函数,一个用于生产数据,另一个用于消费数据。这两个函数都使用了上面创建的线程安全队列进行数据的存取操作。

void producer() {

  int data;

  while (true) {

    data = rand() % 10; // 随机生成一个数据

    mutex.lock();

    queue.push(data);

    mutex.unlock();

    std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 生产者休眠 500 毫秒

  }

}

void consumer() {

  int data;

  while (true) {

    mutex.lock();

    if (!queue.empty()) {

      data = queue.front();

      queue.pop();

    }

    mutex.unlock();

    std::cout << "Consumed " << data << std::endl; // 打印消费的数据

    std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 消费者休眠 1000 毫秒

  }

}

最后,我们创建一个主函数,用于启动生产者和消费者的线程,并等待线程执行完毕。

int main() {

  std::thread t1(producer); // 创建生产者线程

  std::thread t2(consumer); // 创建消费者线程

  t1.join(); // 等待生产者线程执行完毕

  t2.join(); // 等待消费者线程执行完毕

  return 0;

}

到此为止,我们已经成功实现了 C++ 生产者消费者模型。在这个模型中,生产者随机生成数据并放入缓冲区中,而消费者从缓冲区中取出数据并进行相应的处理。通过互斥量的使用,我们可以确保多个线程之间对缓冲区的访问是安全的。

  
  

评论区

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