读者写者与生产者消费者应用场景

news/2024/10/6 20:02:43/文章来源:https://www.cnblogs.com/niumachen/p/18449338

在并发编程中,读写场景和生产者消费者场景是非常经典的两种问题。它们的基本思路和实现方法在许多应用中都可以找到。下面分别介绍这两种场景的一些经典问题及其解决方案。

读写场景

经典问题

  1. 多线程访问共享资源

    • 多个线程需要同时读取某个共享数据(例如,配置文件、缓存等),但在某个线程需要写入时,其他线程必须等待。
  2. 统计信息更新

    • 某个程序模块需要定期更新统计信息,其他模块在此期间仍然可以读取这些信息,而在更新时不允许其他线程读取。

解决方案

  • 读写锁:使用 shared_mutex 来实现多个线程的并发读取,而在写入时使用 unique_lock 确保独占访问。
// 伪代码示例
class SharedData {
private:int data;mutable std::shared_mutex mutex;public:// 读取数据int read() const {std::shared_lock<std::shared_mutex> lock(mutex);return data;}// 写入数据void write(int value) {std::unique_lock<std::shared_mutex> lock(mutex);data = value;}
};

生产者消费者场景

经典问题

  1. 消息队列

    • 消息生产者将消息放入队列,消费者从队列中取出消息进行处理。需要保证在队列为空时消费者等待,而在队列满时生产者等待。
  2. 任务调度

    • 任务生成器将任务添加到任务队列中,而工作线程从任务队列中取出任务并执行。需要处理并发安全和阻塞条件。

解决方案

  • 条件变量:结合 mutexcondition_variable 来实现生产者和消费者之间的协调。
#include <iostream>
#include <queue>
#include <thread>
#include <condition_variable>template <typename T>
class BoundedBuffer {
private:std::queue<T> buffer;size_t max_size;std::mutex mtx;std::condition_variable not_empty;std::condition_variable not_full;public:BoundedBuffer(size_t size) : max_size(size) {}void produce(T item) {std::unique_lock<std::mutex> lock(mtx);not_full.wait(lock, [this] { return buffer.size() < max_size; });buffer.push(item);not_empty.notify_one();}T consume() {std::unique_lock<std::mutex> lock(mtx);not_empty.wait(lock, [this] { return !buffer.empty(); });T item = buffer.front();buffer.pop();not_full.notify_one();return item;}
};

总结

  • 读写场景强调了多个线程如何有效地访问共享资源,尤其是在读取操作多于写入操作时。使用读写锁是一种常见的解决方案。
  • 生产者消费者场景则侧重于在多线程环境中协调数据的生产和消费,确保数据的安全性和系统的高效性。利用条件变量和互斥量是解决此问题的经典方式。

这两种场景广泛应用于数据库、缓存、实时处理系统等各种领域,是并发编程中的重要概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809177.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ide启动多个实例

ide启动多个实例 方法一: ide 2022.X及之后 Run=> Edit Configurations=> 选中项目=> “Build and run”栏=> Modify Options=> 选中“Allow multiple instances”然后就可以run多次项目了 但是要主要改端口 方法二: 先把项目打包,然后启动多个terminal,每个…

周鸿祎:用这10条打造你的完美的商业计划书(附详细讲解)

转载:周鸿祎:用这10条打造你的完美的商业计划书(附详细讲解)_产品 (sohu.com) 江湖上流传着一篇“360大佬周鸿祎版10页商业计划书PPT”,高屋建瓴的讲述了BP制作框架,很有价值。诚然,一个形式上外观精美,具有上有吸引力的BP让人赏心悦目,但更重要的还是有实实在在的内容…

DiLiGenT光度立体数据集

本文对DiLiGenT光度立体数据集进行了详细介绍。简介 ”DiLiGenT“ 光度立体数据集,全称为 calibrated Directional Lightings, objects of General reflectance, and ‘ground Truth’ shapes (normals),即使用标定过的定向光源,对一些具有常见反射率特性的物体进行光度立体…

Pool Kings All In One

Pool Kings All In One 泳池之王 Pool Kings - Mountain Paradise / 泳池之王 - 山间天堂 Utah waterfall MountainPool Kings All In One泳池之王demosPool Kings - Mountain Paradise / 泳池之王 - 山间天堂Utah waterfall Mountainhttps://vimeo.com/233842674 https://www.…

CHT

水电费是否收到fwe】今天探索一下CTH的电脑 PEPPA PIG放映室!tm的图怎么死了

visdom可视化工具

安装visdom可视化工具 pip install visdom -i 作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可…

测绘地理信息赋能新质生产力

在信息化与智能化浪潮的推动下,测绘地理信息作为连接现实世界与数字空间的桥梁,正逐步成为驱动经济社会发展的新质生产力。本文旨在深入探讨测绘地理信息如何通过技术创新与应用拓展,为各行各业赋能,塑造智慧社会的新面貌。一、测绘地理信息的转型之路随着卫星定位系统(如…

2024-2025-1 20241327 《计算机基础与程序设计》第2周学习总结

作业信息 |2024-2025-1-计算机基础与程序设计)| |-- |- |2024-2025-1计算机基础与程序设计第二周作业)| |快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题 |作业正文|https://www.cnblogs.com/shr060414/p/18…

守护“金饭碗”:耕地保护,为经济社会发展筑牢根基

耕地,那片孕育着希望的田野,是我们共同的“金饭碗”。它不仅滋养着亿万生灵,更是我国经济社会发展的坚实后盾。那么,这“金饭碗”究竟蕴藏着怎样的力量,对我国经济社会发展起着怎样的作用呢?一、守护“金饭碗”,粮食安全有保障想象一下,如果我们的“金饭碗”不再丰盈,…

城市扩张与土地资源:压力之下寻平衡之道

在飞速发展的现代城市化进程中,城市扩张犹如一股不可阻挡的力量,既见证了人类文明的辉煌成就,也给土地资源带来了前所未有的压力与挑战。深入分析城市扩张对土地资源造成的影响,并探索可持续的解决方案,以期在城市发展的大潮中,找到与自然和谐共生的平衡点。 一、城市扩张…

实景三维赋能矿山安全风险监测预警

随着科技的不断进步,实景三维技术在矿山安全风险监测预警中的应用越来越广泛,它为矿山安全管理带来了革命性的变革。一、矿山安全现状矿山作为国家重要的能源和原材料基地,其安全生产直接关系到国民经济的发展和社会的稳定。然而,矿山作业环境复杂,地质条件多变,加之人为…

【笔记】SSTI学习

学习记录什么是SSTI的东西 所以什么是SSTI啊? 我不到啊!【笔记】SSTI学习 原文章:尝试黑客攻击 |SSTI (tryhackme.com) 介绍 服务器端模板注入(SSTI)是一种web漏洞攻击,它利用模板引擎的不安全特性实现。 什么是模板引擎? 模板引擎允许您创建可以在应用程序中重复使用的静…