php 用什么做网站服务器,有名的网页游戏,帝国cms做中英文网站,网站标题字符生产者-消费者模型是一种典型的多线程并发模式#xff0c;常用于在一个共享缓冲区中协调生产者和消费者之间的数据传递。在C中#xff0c;我们可以使用标准库中的线程、互斥量和条件变量来实现该模型。以下是一个简单的生产者-消费者模型的实现示例#xff1a;
#include 常用于在一个共享缓冲区中协调生产者和消费者之间的数据传递。在C中我们可以使用标准库中的线程、互斥量和条件变量来实现该模型。以下是一个简单的生产者-消费者模型的实现示例
#include iostream
#include thread
#include mutex
#include condition_variable
#include queue
#include vector// 定义缓冲区容量
const int BUFFER_SIZE 10;// 缓冲区
std::queueint buffer;// 互斥量和条件变量
std::mutex mtx;
std::condition_variable cv_producer, cv_consumer;// 生产者函数
void producer(int id, int num_items) {for (int i 0; i num_items; i) {std::unique_lockstd::mutex lock(mtx);// 如果缓冲区满了等待消费者消费cv_producer.wait(lock, [] { return buffer.size() BUFFER_SIZE; });// 生产一个项目buffer.push(i);std::cout Producer id produced i std::endl;// 通知消费者cv_consumer.notify_one();}
}// 消费者函数
void consumer(int id, int num_items) {for (int i 0; i num_items; i) {std::unique_lockstd::mutex lock(mtx);// 如果缓冲区为空等待生产者生产cv_consumer.wait(lock, [] { return !buffer.empty(); });// 消费一个项目int item buffer.front();buffer.pop();std::cout Consumer id consumed item std::endl;// 通知生产者cv_producer.notify_one();}
}int main() {const int num_producers 3;const int num_consumers 3;const int num_items 20;// 创建生产者和消费者线程std::vectorstd::thread producers, consumers;for (int i 0; i num_producers; i) {producers.emplace_back(producer, i, num_items);}for (int i 0; i num_consumers; i) {consumers.emplace_back(consumer, i, num_items);}// 等待所有线程完成for (auto p : producers) {p.join();}for (auto c : consumers) {c.join();}return 0;
}代码解析
缓冲区使用std::queueint来模拟缓冲区。互斥量和条件变量使用std::mutex来保护缓冲区的访问权使用两个std::condition_variable来协调生产者和消费者。生产者函数生产者在缓冲区未满时生产数据并通知消费者。有一个循环生产指定数量的项目。消费者函数消费者在缓冲区非空时消费数据并通知生产者。有一个循环消费指定数量的项目。主函数创建多个生产者和消费者线程并等待它们完成。
这个示例展示了如何使用C标准库中的线程、互斥量和条件变量来实现一个基本的生产者-消费者模型。可以根据具体需求调整缓冲区的容量、生产者和消费者的数量以及生产和消费的项目数量。