gpt4 book ai didi

c++ - 关于 shared_ptr 的竞争条件示例

转载 作者:行者123 更新时间:2023-12-05 04:29:23 24 4
gpt4 key购买 nike

为什么 code snippet 中没有竞争条件下面,

#include<memory>
#include<thread>

std::shared_ptr<int> g_s = std::make_shared<int>(1);

void f1(std::shared_ptr<int> sp)
{
std::shared_ptr<int>l_s1 = sp; // read g_s
}

void f2()
{
std::shared_ptr<int> l_s2 = std::make_shared<int>(3);
std::thread th(f1, g_s);
th.detach();
g_s = l_s2; // write g_s
}

int main()
{
std::thread(f2).join();
}

code snippet 中存在竞争条件下面?

#include<memory>
#include<thread>

std::shared_ptr<int> g_s = std::make_shared<int>(1);

void f1(std::shared_ptr<int>& sp)
{
std::shared_ptr<int>l_s1 = sp; // read g_s
}

void f2()
{
std::shared_ptr<int> l_s2 = std::make_shared<int>(3);
std::thread th(f1, std::ref(g_s));
th.detach();
g_s = l_s2; // write g_s
}

int main()
{
std::thread(f2).join();
}

我目前对这个问题的想法见第一个答案。但我还不太确定。有人可以阐明这件事吗?

最佳答案

首先,std::shared_ptr保证对底层控制 block 的访问是线程安全的。

对于后一个代码片段,原始指针和指向控制 block 的指针可能同时被不同的线程读取和写入,这将构成竞争。

对于前者,自 void f1(std::shared_ptr<int> sp)按值传递参数(即 std::shared_ptr<T> sp ),同时读取原始指针和指向 sp 的控制 block 的指针独立于将所述指针分配给 g_s .所以不存在数据竞争条件。

关于c++ - 关于 shared_ptr 的竞争条件示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72327077/

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