gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:21:49 24 4
gpt4 key购买 nike

对于此示例代码:

#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中仍然如此。

关于c++ - 在lambda中锁定std::shared_ptr的复制操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59846624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com