21xrx.com
2025-03-22 09:29:19 Saturday
登录
文章检索 我的文章 写文章
C++编程实现生产者消费者模型
2023-06-23 06:53:45 深夜i     --     --
C++编程 生产者 消费者 模型 多线程

生产者消费者模型是计算机科学中的一个经典问题,其目的是解决多线程间的数据共享与调度问题。在该模型中,生产者生成数据并将其存放到共享缓冲区中,而消费者则从缓冲区中读取数据进行处理。为了避免数据的竞争和冲突,需要采用线程同步机制来协调各个线程的操作。在本文中,我们将介绍如何使用C++编程来实现生产者消费者模型。

1. 定义数据结构

首先,需要定义一个数据结构来表示共享缓冲区中的数据。在本例中,我们定义了一个名为Data的类,其中包含了一个整型成员变量value和一个成员函数print,用于输出value的值。


class Data {

public:

  int value;

  void print()

    cout << "Data: " << value << endl;

  

};

2. 定义生产者和消费者类

接下来,需要定义生产者和消费者类。在本例中,我们使用两个线程分别代表生产者和消费者。生产者类Producer中包含了一个成员函数run,用于不断生产数据并将其存放到共享缓冲区中。消费者类Consumer中包含了一个成员函数run,用于不断从共享缓冲区中读取数据并进行处理。


class Producer {

public:

  void run() {

    while (true) {

      unique_lock<mutex> lock(mutex_);

      while (count_ >= max_count_) {

        cout << "Producer waiting..." << endl;

        cv_.wait(lock);

      }

      Data data;

      data.value = rand() % 1000;

      cout << "Producing data: ";

      data.print();

      buffer_[head_] = data;

      head_ = (head_ + 1) % max_count_;

      count_++;

      cv_.notify_all();

      lock.unlock();

      this_thread::sleep_for(chrono::milliseconds(1000));

    }

  }

private:

  mutex mutex_;

  condition_variable cv_;

  int head_ = 0;

  int tail_ = 0;

  int count_ = 0;

  const int max_count_ = 5;

  Data buffer_[5];

};

class Consumer {

public:

  void run() {

    while (true) {

      unique_lock<mutex> lock(mutex_);

      while (count_ <= 0) {

        cout << "Consumer waiting..." << endl;

        cv_.wait(lock);

      }

      Data data = buffer_[tail_];

      cout << "Consuming data: ";

      data.print();

      tail_ = (tail_ + 1) % max_count_;

      count_--;

      cv_.notify_all();

      lock.unlock();

      this_thread::sleep_for(chrono::milliseconds(1000));

    }

  }

private:

  mutex mutex_;

  condition_variable cv_;

  int head_ = 0;

  int tail_ = 0;

  int count_ = 0;

  const int max_count_ = 5;

  Data buffer_[5];

};

3. 主函数中创建线程并启动

最后,在主函数中创建生产者和消费者对象,并使用std::thread类创建两个线程分别代表生产者和消费者,然后启动它们。


int main() {

  Producer producer;

  Consumer consumer;

  thread producer_thread(&Producer::run, &producer);

  thread consumer_thread(&Consumer::run, &consumer);

  producer_thread.join();

  consumer_thread.join();

  return 0;

}

通过以上代码,我们成功实现了生产者消费者模型,并在控制台中输出了生成和消费的数据。这种实现方式可以有效地解决线程间的数据共享问题,并保证了数据的正确性和安全性。

  
  

评论区

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