首页 > 其他分享 >读者写者与生产者消费者应用场景

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

时间:2024-10-06 20:26:53浏览次数:1  
标签:std 场景 生产者 lock 写者 线程 mutex size

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

读写场景

经典问题

  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;
    }
};

总结

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

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

标签:std,场景,生产者,lock,写者,线程,mutex,size
From: https://www.cnblogs.com/niumachen/p/18449338

相关文章

  • 分析、总结Python使用列表、元组、字典的场景
    分析、总结Python使用列表、元组、字典的场景在Python中,列表、元组和字典是最常用的数据结构,每种数据结构都有其特定的应用场景。以下是对这三种数据结构的分析与总结:1.列表(List)特点:可变性:可以动态地修改、添加、删除元素。顺序性:保持元素的插入顺序。允许重复:可以包含相......
  • 03_Elasticsearch的功能、适用场景以及特点介绍
    1、Elasticsearch的功能,干什么的2、Elasticsearch的适用场景,能在什么地方发挥作用3、Elasticsearch的特点,跟其他类似的东西不同的地方在哪里1、Elasticsearch的功能(1)分布式的搜索引擎和数据分析引擎搜索:百度,网站的站内搜索,IT系统的检索数据分析:电商网站,最近7天牙膏这种商品......
  • 【产品经理修炼之道】- 中后台产品实践:以智慧城市场景【数据融合治理平台】产品为例
    智慧城市治理产品该如何构建?作者结合自身经历,总结过去所负责的产品和项目,梳理并构建城市治理(智慧城市)的整体业务架构、以及通过调研分析城市治理的发展趋势和市场情况,并对其需要进行产品设计。本篇文章,旨在对个人从事TOG工作3年半(待过2家做2G业务的公司)的工作内容的一个总结......
  • 流量劫持常见的攻击场景
    流量劫持常见的攻击场景流量劫持是一种网络攻击手段,攻击者通过操控数据包的传输过程来窃取、篡改或伪造通信内容。这种攻击可以在多个层面上发生,通常会导致用户敏感信息的泄露、数据的篡改以及其他更严重的后果。以下是一些常见的流量劫持攻击场景:1.DNS劫持DNS劫持的攻击目标......
  • 前端某些属性的灵活应用场景
    在前端的发展过程中,因为部分属性的灵活性而发展更多应用场景,下面介绍两个1.CSSfloat属性的演变:最初的目的:CSSfloat属性在CSS2.1中的设计最初是为了文字环绕图像。这意味着,你可以让文字围绕在一个浮动的图像旁边,使页面内容更具美观性。演变为布局工具:随着时间的推移......
  • 从手机发布会的现场测试谈“用户使用场景”
    一红米Note14发布会的现场测试前几天红米Note14发布,现场测试手机防摔、防水、防油触摸以及长时间续航。先不管测试结果怎么样,能不能让大多目标用户满意。单说这种介绍形式,就足够吸引人。这种形式站在了目标用户的使用场景之中,提炼出用户使用中的痛点,针对痛点提出自己的解决方......
  • 谨防火灾!电瓶车检测AI算法助力城市/小区/园区多场景安全管理精细化、智能化
    随着人工智能技术的快速发展,AI智能分析网关V4在电瓶车检测领域的应用日益广泛。这一技术通过深度学习、计算机视觉等先进算法,实现了对电瓶车及其相关行为的智能识别和分析,为电瓶车的管理和应用提供了强大的技术支持。一、电瓶车检测算法的工作原理电瓶车检测AI算法主要基于计算......
  • linux: ss的常用场景
    一,列出所有监听中的端口#-l:  仅显示处于监听状态的套接字#-n: 以数字格式显示地址和端口。使用此选项可以避免将地址和端口转换为主机名或服务名,从而加快查询速度#-t: 仅显示TCP套接字信息#-p: 显示与每个套接字相关联的进程信息,包括进程ID和进程名称ss-lntp二,查......
  • 责任链模式:如何解决审核、过滤场景问题?
    相较而言,责任链模式是一个使用频率很高的模式,大家在日常的开发过程中,也可能会经常遇到,下面,我们就一起来了解一下责任链模式的内容。一、模式原理分析责任链模式的原始定义是:通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿着链传递请求,直到......
  • 结婚证识别-离婚证识别接口-结婚证识别API应用场景
    在信息化与智能化高速发展的今天,证件的自动识别技术逐渐成为了各行各业数字化转型的关键工具,而结婚证识别接口、离婚证识别接口正在悄然改变着传统的民政工作方式。结婚证识别与离婚证识别接口是基于光学字符识别(OCR)技术的智能解决方案。通过这一接口,用户可以轻松实现对......