gpt4 book ai didi

c++ - 关于weak_ptr的线程安全

转载 作者:IT老高 更新时间:2023-10-28 22:23:42 29 4
gpt4 key购买 nike

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

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

关于上面的代码,我知道读取和写入相同 shared_ptr 的不同线程会导致竞争条件。但是 weak_ptr 呢?下面的代码中是否有任何竞争条件? (我的平台是微软VS2013。)

std::weak_ptr<int> g_w;

void f3()
{
std::shared_ptr<int>l_s3 = g_w.lock(); //2. here will read g_w
if (l_s3)
{
;/.....
}
}

void f4()
{
std::shared_ptr<int> p_s = std::make_shared<int>(1);
g_w = p_s;

std::thread th(f3);
th.detach();
// 1. p_s destory will motify g_w (write g_w)
}

最佳答案

我知道我迟到了,但是在搜索“weak_ptr 线程”时会出现这种情况,而 Casey 的回答并不是全部真相。 两者都是shared_ptrweak_ptr无需进一步同步即可从线程中使用。

对于 shared_ptr ,有很多文档(例如在 cppreference.comstackoverflow 上)。您可以安全访问 shared_ptr即指向来自不同线程的同一个对象。您只是不能从两个线程中敲击同一个指针。换句话说:

// Using p and p_copy from two threads is fine.
// Using p from two threads or p and p_ref from two threads is illegal.
std::shared_ptr<A> p = std::make_shared<A>();
std::shared_ptr<A> &p_ref = p;
std::shared_ptr<A> p_copy = p;

要在您的代码中解决该问题,请通过 g_s作为参数(按值)* 到 f1() .

对于弱指针,安全保证隐藏在 weak_ptr::lock 的文档中:

Effectively returns expired() ? shared_ptr<T>() : shared_ptr<T>(*this), executed atomically.

您可以使用 weak_ptr::lock()获取 shared_ptr来自其他线程,无需进一步同步。这也得到证实here用于 Boost 和 this SO answer由 Chris Jester-Young 撰写。

同样,您必须确保不要修改相同的 weak_ptr从一个线程同时从另一个线程访问它,所以传递 g_w进入 f3()按值(value)计算。

关于c++ - 关于weak_ptr的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20705304/

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