首页 > 其他分享 >借shared_ptr实现写时复制(COW)

借shared_ptr实现写时复制(COW)

时间:2023-12-25 17:11:24浏览次数:21  
标签:std write COW read vptr 计数 对象 shared ptr

原理

1、使用智能指针管理共享资源

2、write端,若引用计数为1,则write端独占资源,若引用计数不为1,则对共享资源备份进行写操作,以确保线程安全

3、read端,读之前引用计数加1,write端此时若并发访问共享资源,则会发现引用计数不为1,write端不会直接写共享资源,确保线程安全

代码

#include <memory>
#include <vector>
#include <mutex>

// 共享资源
std::shared_ptr<std::vector<int>> g_vptr;

// 该互斥锁只用来保证访问shared_ptr时的线程安全
// 读写std::vector<int>的线程安全通过shared_ptr的引用计数保证
std::mutex g_mutex;

void read()
{
    std::shared_ptr<std::vector<int>> vptr;
    {
        std::lock_guard<std::mutex> g(g_mutex);
        vptr = g_vptr;
    }

    for(auto i : *vptr)
    {
        // read
    }
}

void write(int data)
{
    std::lock_guard<std::mutex> g(g_mutex);
    if(!g_vptr.unique())
    {
        g_vptr.reset(new std::vector<int>(*g_vptr));
    }

    g_vptr->push_back(data);
}

代码释义

假设read时开始了并发writeread后原对象引用计数为2,即vptrg_vptr都指向原对象,write时对g_vptr进行reset操作后,原对象引用计数减1,此时原对象引用计数为1,还不会被析构,只有vptr指向原对象,而g_vptr指向原对象的副本(一个新的对象),这样以来write里对g_vptr的写和read里对vptr的读不会相互影响。当read里完成对vptr的读,原对象引用计数减1,原对象引用计数为0,原对象析构,而write里被修改的原对象副本此时已经成为新的原对象,后续读写都将基于这个新的原对象进行

参考

陈硕《Linux多线程服务端编程》

标签:std,write,COW,read,vptr,计数,对象,shared,ptr
From: https://www.cnblogs.com/horacle/p/17926528.html

相关文章

  • P3612 [USACO17JAN] Secret Cow Code S
    P3612[USACO17JAN]SecretCowCodeS自我感想哎,又是一道写不出来的。完全没有这样的思路,只会笨b模拟只能得40.解题前应该的思考通过题目给的数据可以知道纯暴力模拟肯定爆空间。(基本否定正推)这里根据题目所说的,其实可以知道是一个初字符串通过固定的规律形成新的字符串。(......
  • [C++] 智能指针(shared_ptr、unique_ptr)
    作者:丶布布......
  • C++ unique_ptr简单使用
    #######################智能指针(智能指针是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保在离开指针所在作用域时,自动正确的销毁动态分配的对象,防止内存泄漏)头文件#include<memory>unique_ptr特性(属性为对象,而不是指针,管理指针)(1).基于排他所有权模式:两个指......
  • SharedFlow vs StateFlow,一篇看懂选择和使用技巧
    引言在Android应用开发中,数据流是一个至关重要的概念。而在Jetpack库中,SharedFlow和StateFlow是两个处理数据流的利器,它们基于协程,提供了一种响应式的编程方式。本文将深入探讨这两个类的原理,以及在实际开发中的使用技巧。原理分析SharedFlow和StateFlow基于协程构建,它们利用......
  • Flutter使用SharedPreferences示例
    SharedPreferencesAndroid原生开发经常会用SharedPreferences来保存一些设置,Flutter用什么来保存这些设置呢?在Flutter中,你可以使用shared_preferences插件来实现类似Android原生开发中的SharedPreferences功能,用于在应用程序中保存和检索持久化的键值对。具体使用首先,在你的Fl......
  • zabbix接收snmptrap并触发告警
    1、配置陷阱处理脚本#在zabbix服务器或者代理服务器上,复制源码目录中的Perl脚本到/usr/bin目录下并赋予执行权限cpzabbix-6.0.2/misc/snmptrap/zabbix_trap_receiver.pl/usr/bin/chmoda+x/usr/bin/zabbix_trap_receiver.pl2、安装snmp相关软件包yum-yinstallnet-s......
  • C++(std::unique_ptr)
    std::unique_ptr是C++标准库中的一种智能指针,用于管理动态分配的内存。它是一种独占拥有权(exclusiveownership)的智能指针,保证同一时刻只有一个std::unique_ptr指向特定的资源。当std::unique_ptr被销毁时,它所拥有的资源也会被释放。以下是std::unique_ptr的基本用法和......
  • C++(std::shared_ptr)
    std::shared_ptr是C++标准库中的一个智能指针类,用于管理动态分配的内存。它提供了一种共享拥有权(sharedownership)的机制,通过引用计数来跟踪指向同一块内存的所有std::shared_ptr实例。当最后一个std::shared_ptr被销毁时,它会自动释放所拥有的内存。基本用法:#include<me......
  • unique_ptr 和 shared_ptr
    unique_ptr和shared_ptr是C++标准库中的智能指针,用于管理动态分配的对象的生命周期,以避免内存泄漏和手动资源管理的问题。unique_ptr:std::unique_ptr是一个独占所有权的智能指针,确保在任何时候只有一个unique_ptr拥有对动态分配的对象的所有权。当unique_ptr被销......
  • 基于kvm虚拟机创建openstack qcow2磁盘镜像
    前提知识KVM做单机管理虚拟机,Openstack集群管理虚拟机 使用工具virt-manager 虚拟机管理器(VirtualMachineManager) 目标基于Kylin-Server-V10-SP3-General-Release-2303-X86_64.iso创建qcow2格式的openstack磁盘镜像 qcow2镜像制作使用环境      IP:......