1。 我几天前发布了问题(About thread-safety of weak_ptr),现在我有另一个相关的问题。 如果我做这样的事情,会在上面的例子中引入竞争条件为g_w吗?(我的平台是ms 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() //f4 run in main thread
{
std::shared_ptr<int> p_s = std::make_shared<int>(1);
g_w = p_s;
std::thread th(f3); // f3 run in the other thread
th.detach();
// 1. p_s destory will motify g_w (write g_w)
}
2.我知道从std :: tr1 :: shared_ptr / weak_ptr派生的std :: shared_ptr / weak_ptr,以及从boost :: shared_ptr / weak_ptr派生的std :: tr1 :: shared_ptr / weak_ptr,是否有任何区别该工具,特别是在线程安全的救济中。
答案 0 :(得分:1)
std::thread
的已完成构造与正在创建的线程中指定函数的调用同步,即在构造f4
之前发生的所有 {1}}保证在新线程开始执行std::thread th
时可见。特别是f3
中g_w
f4
中的g_w = p_s;
的写入对f4
中的新主题可见。
评论// 1. p_s destory will motify g_w (write g_w)
中的陈述不正确。 p_s
的破坏无法以任何方式访问g_w
。在大多数实现中,它确实修改了一个公共控制块,用于跟踪对指针对象的所有共享和弱引用。对标准库实现内部对象的任何此类修改都是使线程安全的库,而不是你的,根据C ++11§17.6.5.9/7“如果对象不可见,实现可以在线程之间共享它们自己的内部对象用户并受到数据竞赛的保护。“
假设程序中其他地方没有对g_w
进行并发修改,并且没有其他线程执行f3
,则g_w
上的此程序中没有数据竞争。
答案 1 :(得分:0)
@Casey
首先,我完成了我的代码。
int main()
{
f4();
getchar();
retrun 0;
}
我在2013年的visual studio中找到了一些代码。