首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

共享资源最快的多读/单写保护 - C++

共享资源最快的多读/单写保护是一种在C++中实现多线程同步的方法,其目的是允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这种保护方法可以提高多线程程序的性能,特别是在读操作远多于写操作的情况下。

在C++中,可以使用std::shared_mutex实现这种保护方法。std::shared_mutex允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。当一个线程想要读取共享资源时,它可以调用std::shared_mutex::lock_shared()方法,该方法会阻塞直到资源可用。当一个线程想要写入共享资源时,它可以调用std::shared_mutex::lock()方法,该方法也会阻塞直到资源可用。

以下是一个简单的示例,展示了如何使用std::shared_mutex实现多读/单写保护:

代码语言:cpp
复制
#include <mutex>
#include<vector>
#include<thread>

std::vector<int> shared_data;
std::shared_mutex shared_mutex;

void reader() {
    while (true) {
        // 锁定共享资源以进行读操作
        shared_mutex.lock_shared();
        // 读取共享资源
        for (int i : shared_data) {
            // 处理数据
        }
        // 解锁共享资源
        shared_mutex.unlock_shared();
    }
}

void writer() {
    while (true) {
        // 锁定共享资源以进行写操作
        shared_mutex.lock();
        // 写入共享资源
        shared_data.push_back(42);
        // 解锁共享资源
        shared_mutex.unlock();
    }
}

int main() {
    std::thread reader_thread(reader);
    std::thread writer_thread(writer);

    reader_thread.join();
    writer_thread.join();

    return 0;
}

在这个示例中,reader线程可以同时读取共享资源,而writer线程则会阻塞直到共享资源可用。这种保护方法可以提高多线程程序的性能,特别是在读操作远多于写操作的情况下。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++继承、继承情况下虚函数表分析

C++三大特性之一多态是基于虚函数实现,而大部分编译器是采用虚函数表来实现虚函数,虚函数表(VTAB)存在于可执行文件只读数据段中,指向VTAB虚表指针(VPTR)是包含在类每一个实例当中。...《深度探索C++对象模型》 一、继承 1 #include 2 #include 3 using namespace std; 4 class A {...这些表按照派生顺序依次排列,如果子类改写了父类虚函数,那么就会用子类自己虚函数覆盖虚函数表相应位置,如果子类有新虚函数,那么就添加到第一个虚函数表末尾。...再简单总结一下 覆盖 隐藏 重载 区别: 覆盖 是C++虚函数实现原理,基类虚函数被子类重写,要求函数参数列表相同; 隐藏 是C++名字解析过程,分两种情况,基类函数有virtual,参数列表不同...重载 是在同一命名空间中根据参数对同名函数区别。

2.7K10

C++】继承 ① ( 面向对象特点 | 类之间关系 | 继承与继承 | 继承关系特性 )

属性 和 方法 ; 多态 : 相同操作作用于不同对象 , 产生不同结果 ; 2、类之间关系 类之间关系可以分为 三 大类 : HAS-A 类关系 : 类由多个部件组成 , 类中数据也是其它类...1、名词说明 继承 是两个类之间关系 ; 在C++中,使用 : 运算符来实现继承 ; A 类 是 父类 , B 类 是 子类 ; B 类 继承 A 类 , A 类 派生 B 类 ; 父类 又称为 基类...; 子类 又称为 派生类 ; 2、继承与继承 继承 与 继承 : A 类 只有一个 子类 B 类 , 那么 该继承 就是 继承 ; A 类 有多个子类 B1 类 , B2 类 … , 该 继承...是 继承 ; 继承 继承是指一个类只能继承一个父类特性和行为 ; 下面的代码中 , Child 类继承了 Parent 类所有公有和保护成员 , 并且可以访问它们 ; 注意 : Child...}; 继承 继承是指一个类可以继承多个父类特性和行为 ; 下面的代码中 , Child 类继承了 Parent1 和 Parent2 类所有 公有 和 保护 成员 , 并且可以访问它们 ;

19230
  • 瀚海微SD NAND之SD 协议(37)SPI总线保护和读写

    数据读取SPI模式支持块读取和块读取操作(SD Memory Card协议中CMD17或CMD18)。在接收到一个有效命令后,卡将用一个响应令牌和一个数据令牌进行响应,参考下图。...在块读取操作情况下,每个传输块都有其16位CRC后缀。停止传输命令(CMD12)实际上会停止数据传输操作(与SD Memory Card操作模式相同)。数据写入SPI模式支持块和块写命令。...CRC后缀、块长度和起始地址限制(CSD参数WRITE BL PARTIAL控制部分块写选项和WRITE_BL_LEN除外)与操作相同,参考下图每个数据块都有一个“开始块”标记前缀(一个字节)。...在块写操作中,停止传输将通过在下一个块开始处发送' stop Tran'令牌而不是'Start Block'令牌来完成。...重置存储卡(使用CMDO用于SD存储卡)将终止任何挂起或正在进行编程。这可能会破坏卡上数据格式。预防是主机责任擦写保护管理SPI模式写保护管理过程与SD模式写保护管理过程相同。

    12310

    多进程单线程模型与进程多线程模型之争

    服务器,事件 多进程单线程模型典型代表:nginx 进程多线程模型典型代表:memcached 另外redis, mongodb也可以说是走“多进程单线程模”模型(集群),只不过作为数据库服务器,需要进行写保护...,只提供了同步。...线程负责处理已经建立好连接读写等事件 进程多线程 进程多线程肯定比多进程单线程快一些 多进程单线程与进程多线程目的都是想尽可能利用CPU,减少CPU空闲时间,特别是多核环境...拜托,如果你真的想要密集处理,请使用C C++。(我个人只会用C)你见过哪个数据库服务器是java c#写?...而现在,我觉得Rust lang是一个好方向: 面向操作系统编程 从语言层面上提供并发 自诩C++替代者 将会重写firefox Mozilla开发 Javascript作者Brendan Eich

    1.4K20

    C++】来探索“例模式”

    例类存在,就是为了避免这些情况出现,把人打了,是“我”打的就是“我”打的,处理机密信息,就是,写就是写。...具体操作方法在上一篇用C++跟你聊聊“例模式”,类计划生育之中已经讲得清楚了。 所以这一篇我们来拓展一些上一篇没有讲到。...例模式优缺点 优点 由于例模式在内存中只存在一个对象,减少了内存开支,特别是当对象需要频繁创建、销毁时,而且创建或销毁时性能又无法优化,例模式优势就非常明显。...例模式可以避免对内存多重占用。 例模式可以在系统设置全局访问点,优化和共享资源访问。这招我经常用,也很喜欢,因为确实方便,做一个标志位例类,负责所有数据表映射处理。...(要了解可以私信我) 缺点 例模式一般没有接口,难以拓展。如果要拓展,考虑重构。 例模式对于测试是不利。在并发环境中,如果例没有完成,是不能进行测试

    63830

    Linux 进程间通信

    通常情况下,大部分程序是不要考虑进程间通信,因为大家所接触绝大部分程序都是进程程序(可以有多个线程),对于一些复杂、大型应用程序,则会根据实际需要将其设计成多进程程序。...消息队列是 UNIX 下不同进程之间实现共享资源一种机制,UNIX 允许不同进程将格式化数据流以消息队列形式发送给任意进程,有足够权限进程可以向队列中添加消息,被赋予权限进程则可以走队列中消息...4、信号量 信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内多个线程间对共享资源访问,相当于内存中标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志...,除了用于共享资源访问控制外,还可用于进程同步。...共享内存是最快 IPC 方式,它是针对其它进程间通信方式运行效率低而专门设计,它往往与其它通信机制,譬如结合信号量来使用,以实现进程间同步和通信。

    3.2K20

    图解 | 进程之间通信方式

    进程间通信示意图 管道(pipe) 管道包括三种: 普通管道:通常有两种限制,一是工,只能单向传输;二是只能在父子或者兄弟进程间使用....命名管道:去除了第二种限制,可以在许多并不相关进程之间进行通讯. 管道实现通信功能步骤: 信号量(semophore) 信号量是一个计数器,可以用来控制多个进程对共享资源访问。...它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间同步手段。...共享内存是最快 IPC(进程间通信) 方式,它是针对其他进程间通信方式运行效率低而专门设计。它往往与其他通信机制,如信号量,配合使用,来实现进程间同步和通信。...消息队列:容量受到系统限制,且要注意第一次时候,要考虑上一次没有读完数据问题。 信号量:不能传递复杂消息,只能用来同步。

    1.4K31

    SDIO接口_gmac接口是什么意思

    对于命令,首先HOST会向DEVICE发送命令,紧接着DEVICE会返回一个握手信号,此时,当HOST收到回应握手信号后,会将数据放在4位数据线上,在传送数据同时会跟随着CRC校验码。...不同SDd卡,主控根据其功能,支持不同命令集 如下: Class0 :(卡识别、初始化等基本命令集) CMD0:复位SD 卡. CMD1:OCR寄存器. CMD9:CSD寄存器....CMD10:CID寄存器. CMD12:停止块时数据传输 CMD13: Card_Status 寄存器 Class2 (读卡命令集): CMD16:设置块长度 CMD17:块....CMD18:块,直至主机发送CMD12为止 . Class4(写卡命令集) : CMD24:写块. CMD25:写块. CMD27:写CSD寄存器 ....Class6(写保护命令集): CMD28:设置写保护地址. CMD29:擦除写保护地址.

    1.2K20

    单片机通信之SPI通信

    之前已经给大家介绍过了单片机UART通信和IIC通信,大家可以点击“利用IIC协议实现单片机对EEPROM和写操作”、“单片机通信之串口通信”进行回顾。...(4)写保护寄存器中WP为写保护位,当WP=1,写保护,当WP=0未写保护,当对日历、时钟寄存器或片内RAM进行写时WP应清零,当对日历、时钟寄存器或片内RAM进行时WP一般置1。...第二个字节就是要或写数据了。 单字节读写:只有在SCLK为低电平时,才能将CE置为高电平。...(1)首先,与IIC类似,要单独编写和写程序方便调用。写函数——在SCK为0时片选CE由低变高,开始传送八位地址(注意是从低位开始),然后写入八位数据。函数类似,不过有一个返回值。...基本可以概括为 :将总线上数据存放到定义变量中。 写:将命令字节放到总线上。 在时序上,SPI 是不是比 I2C要简单

    1.1K20

    【Linux内核锁】内核锁那点事

    竞态(RaceConditions):并发执行单元对共享资源访问,容易导致竞态。 共享资源:硬件资源和软件上全局变量、静态变量等。 解决竞态途径是:保证对共享资源互斥访问。...互斥访问:一个执行单元在访问共享资源时候,其他执行单元被禁止访问。 临界区(Critical Sections):访问共享资源代码区域成为临界区。临界区需要以某种互斥机制加以保护。...2、竞态发生场合 image-20230511140139520 对称处理器(SMP)多个CPU之间 多个CPU使用共同系统总线,可以访问共同外设和存储器。...3.2.1 CPU之间 处理器为了解决多核之间,一个CPU行为对另一个CPU可见情况,ARM处理器引入了内存屏障指令: DMB(数据内存屏障),保证在该指令前所有指令,内存访问完成,再去访问该指令之后访存动作...3.2.2 CPU内部 在CPU中,我们常遇到访问外设寄存器时,某些外设寄存器就对读写顺序有很高要求,为了避免执行乱序发生,这时候就需要CPU一些内存屏障指令了。

    22220

    SD NAND应用存储功能描述(7)擦除和写保护

    块写操作之前预擦除设置设置预擦除写块数量(ACMD23)将使后续块写操作比不使用ACMD23相同操作更快。主机将使用这个命令来定义在下一次写操作中要发送多少个写块。...建议在CMD25之前使用此命令,有些卡对于写块操作会更快。注意,如果主机想要使用预擦除特性,则应该在WRITE命令之前发送ACMD23。...发送写块数使用Pipeline机制进行数据缓冲区管理系统,在某些情况下,如果在块写入操作中发生错误,则无法确定哪个块是最后一个被写入闪存。卡将用写入良好数量响应ACMD22。...卡发送一个包含32个写保护位(代表从指定地址开始32个写保护组)数据块,后跟16个CRC位。写保护命令中地址字段为组地址,单位为字节。该卡将忽略所有低于组大小LSB。...card lock/unlock命令具有普通块写命令结构和总线事务类型。传输数据块包括命令所需所有信息(密码设置模式、PWD本身、卡锁/解锁等)。命令数据块结构如下表所示。

    11310

    Linux内核中各种锁:信号量互斥锁读写锁原子锁自旋锁内存屏障等

    进程对信号量有PV操作,P操作就是进入共享资源区前-1,V操作就是离开共享资源后+1(这个时候信号量就表明还可以允许多少个进程进入该临界区)。...要注意:信号量本身也是个共享资源,它++操作(释放资源)和--操作(获取资源)也需要保护。其实就是用自旋锁保护。...它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这可以提高并发性能,因为操作通常比写操作频繁得多。读写锁这种就属于高阶锁了,它实现就可以用自旋锁。...: volatile int x, y; 注意,C++volatile关键字只能避免编译期指令重排,对于CPU指令重排不起作用,所以实际上代码真正运行时候,可能又是乱序。...而Javavolatile关键字好像具有编译器、CPU两个层面的内存屏障作用。 CPU乱序访问内存: 在 CPU 上,不考虑编译器优化导致乱序前提下,多线程执行不存在内存乱序访问问题。

    1.1K10

    优盘坏了,只能扔掉?别着急,说不定简单地操作几下就能修复了

    优盘,可以说是最方便存储介质了——当年软盘很容易坏,光盘又不方便带,几次还容易花,移动硬盘又太重,只有优盘,体积小方便携带、读写速度还快,但是日常使用过程中,还是经常会碰到优盘损坏事例,在此告诫大家...没有重要资料优盘,一旦出现问题,就不必惊慌了,但是也不用出问题就扔掉,说不定简单修复操作,就能救回你优盘呢。...2、优盘插入电脑时候,只显示盘符,却不显示容量,双击打开就弹出对话框,提示:“优盘被写保护”或者“需要格式化”,就算点“是”确认格式化操作,也是无法完成。...需要说明是,早期优盘,大多数是有写保护开关,而且是物理开关,写保护状态下,只能读取文件,不能写入文件,更不能进行格式化操作,这是从软盘上引用而来,旨在保护优盘里面的文件不被病毒破坏,或者不被误删除...,但是现在自带物理写保护开关优盘,已经极少见了,所以“优盘被保护”提示,应该是优盘出问题了,而不是写保护开关被打开了。

    87510

    ds1302实时时钟lcd1602显示_电子时钟单片机

    它经过一个简 串行接口与微处理器通信。实时时钟/日历可对秒,分,时,日,周,月,和年进行计数,对于小于 31 天月,月末日期自动进行调整,还具有闰年校正功能。...控制寄存器 位7是写保护位(WP),其他7位均置0,对时钟和RAM进行写操作时,WP必须为0,也就是关闭写保护,当WP为1时,就是只读模式。...如前所述,位 6 规定时钟或 RAM 而位 0 规定或写。在时钟\日历寄存器中地址 9 至 31或 RAM 寄存器中地址 31 不能存储数据。在多字节方式中或写从地址 0 位 0 开始。...那写入 时 为18点 代码则是: ds1302_write(0x84,0x18); //写入时 为 18点 单字节时序 /*DS1302单字节函数*/ unsigned char ds1302...寄存器是85H time = ds1302_read_data(0x85); 写保护寄存器 写保护寄存器位 7 是写保护位。

    1.1K50

    如何理解互斥锁、条件变量、读写锁以及自旋锁?

    不过看『共享-独占锁』或者『读写锁』这两个名称,其实并未区分对于和写,到底谁共享,谁独占。可能会让人误以为读写锁是一种更为泛化称呼,其实不是。读写锁含义是准确:是一种 共享,写独占锁。...读写锁特性: 当读写锁被加了写锁时,其他线程对该锁加锁或者写锁都会阻塞(不是失败)。 当读写锁被加了锁时,其他线程对该锁加写锁会阻塞,加锁会成功。 因而适用于少写场景。...: 线性数据。...用数组实现环形队列,避免vector等动态扩张数据结构,写在结尾,由于写因而可以不加锁;读在开头,由于(避免重复消费)所以需要加一下锁(互斥量就行)。 KV。...最最通俗一个理解,其实就是死循环……。 看使用方法和使用互斥量代码是差不多。只不过自旋锁不会引起线程休眠。当共享资源状态不满足时候,自旋锁会不停地循环检测状态。

    1.4K30

    互斥锁、自旋锁、读写锁、悲观锁、乐观锁应用场景

    否则,自旋锁在 CPU 上无法使用,因为一个自旋线程永远不会放弃 CPU。...读写锁从字面意思我们也可以知道,它由「锁」和「写锁」两部分构成,如果只读取共享资源用「锁」加锁,如果要修改共享资源则用「写锁」加锁。 所以,读写锁适用于能明确区分操作和写操作场景。...读写锁工作原理是: 当「写锁」没有被线程持有时,多个线程能够并发地持有锁,这大大提高了共享资源访问效率,因为「锁」是用于读取共享资源场景,所以多个线程同时持有锁也不会破坏共享资源数据。...知道了读写锁工作原理后,我们可以发现,读写锁在读写少场景,能发挥出优势。 另外,根据实现不同,读写锁可以分为「优先锁」和「写优先锁」。...悲观锁做事比较悲观,它认为多线程同时修改共享资源概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁。 那相反,如果多线程同时修改共享资源概率比较低,就可以采用乐观锁。

    1.4K40

    字节跳动Go 语言面试会问哪些问题?

    5、RWMutex 注意事项 RWMutex 是锁,该锁可以加多个锁或者一个写锁 锁占用情况下会阻止写,不会阻止,多个goroutine 可以同时获取锁 写锁会阻止其他 goroutine...(无论和写)进来,整个锁由该 goroutine独占 适用于写少场景 RWMutex 类型变量零值是一个未锁定状态互斥锁。...RWMutex 一个写锁 Lock 去锁定临界区共享资源,如果临界区共享资源已被(锁或写锁)锁定,这个写锁操作 goroutine 将被阻塞直到解锁。...6、Cond 是什么 Cond 实现了一种条件变量,可以使用在多个 Reader 等待共享资源 ready 场 景(如果只有一一写,一个锁或者 channel 就搞定了) 每个 Cond 都会关联一个...Once 常常用来初始化例资源,或者并发访问只需初始化一次共享资 源,或者在测试时候初始化一次测试资源。

    39820

    STM32系统中2种数据掉电保护方法

    比如(基于I2C24C02等等)往往会造成额外PCB空间增大,硬件成本增加,降低产品性价比。...在stm32芯片中,Flash读写单位都是以“页”为单位,以STM32F103C8T6为例,它每页大小为2K bytes; 软件编程要点 读写保护解除:使用这种方法前提是,当前和写Flash允许...所以暂时一些关于OptionBytes操作和Flash写保护操作等API暂时不做讨论。...考虑到flash读写保护逻辑机制,该方法最好在不考虑数据安全性问题前提下,才使用这种方法。 对于诸如此类掉电保护数据方法,这里仅仅是抛砖引玉,欢迎大家多多提出更好方案。...暂时分享这么,谢谢大家。

    1.8K31
    领券