在lambda中锁定std :: shared_ptr的复制操作

洛格曼

对于此示例代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <memory>

struct A
{
    int _i;
    A(int i):_i(i)
    {
        std::cout<<"A() "<<_i<<std::endl;
    }
    ~A()
    {
        std::cout<<"~A() "<<_i<<std::endl;
    }
    void Print()
    {
        std::cout<<"Print() "<<_i<<std::endl;
    }
};

struct B
{
    std::shared_ptr<A> Asp;
    std::mutex AspMutex;

    void SetA()
    {
        static int i = 0;
        std::unique_lock<std::mutex> lock(AspMutex);
        Asp = std::make_shared<A>(i);
    }

    void AccessA1()
    {
        std::shared_ptr<A> aspCopy;
        {
            std::unique_lock<std::mutex> lock(AspMutex);
            aspCopy = Asp;
        }
        (*aspCopy).Print();
    }

    void AccessA2()
    {
        auto aspCopy = [&]()
        {
            std::unique_lock<std::mutex> lock(AspMutex);
            return Asp;
        }();
        (*aspCopy).Print();
    }

    void AccessA3()
    {
        (*[&]()
        {
            std::unique_lock<std::mutex> lock(AspMutex);
            return Asp;
        }()
        ).Print();
    }

};

int main()
{
    B b;
    b.SetA();
    std::thread t([&]{b.SetA();});
    b.AccessA1();
    b.AccessA2();
    b.AccessA3();
    t.join();
}

我很好奇c ++ 17(或更高版本)标准是否可以保证A::Access1A::Access2方法是线程安全的(的副本std::shared_ptr将受到的保护lock)。

埃雷里卡

是。锁品牌A::Access1A::Access2线程安全的并发SetA在C ++ 17中仍然如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

std :: shared_ptr在复制对象时引起问题

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

不可复制的对象,映射和shared_ptr:复制构造函数中的错误

来自分类Dev

不可复制的对象,映射和shared_ptr:复制构造函数中的错误

来自分类Dev

如何将std :: vector <boost :: shared_ptr <T >>复制到std :: list <T>

来自分类Dev

std :: shared_ptr模板化与非模板化的复制/移动构造函数

来自分类Dev

C ++ std :: shared_ptr,是否operator =重载以使用复制构造函数?

来自分类Dev

std :: shared_ptr模板化与非模板化的复制/移动构造函数

来自分类Dev

为什么没有[]操作符用于std :: shared_ptr?

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

std :: weak_ptr:锁定还是shared_ptr构造函数?

来自分类Dev

Lambda Capture shared_ptr成员

来自分类Dev

将带有lambda的std :: shared_ptr插入向量中

来自分类Dev

std :: shared_ptr和继承

来自分类Dev

std :: function和shared_ptr

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

std :: shared_ptr预分配内存

来自分类Dev

std set of boost :: shared_ptr <string>

来自分类Dev

可重用的std :: shared_ptr

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

std :: shared_ptr初始化

来自分类Dev

如何访问std :: shared_ptr的内容?

Related 相关文章

热门标签

归档