【问题标题】:about race condition of weak_ptr关于weak_ptr的竞争条件
【发布时间】:2013-12-24 03:15:28
【问题描述】:

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 有什么区别吗?该工具,尤其是在线程安全的救济中。

【问题讨论】:

  • p_s的销毁不会修改g_w。它不会写信给g_w

标签: multithreading c++11 race-condition weak-ptr


【解决方案1】:

std::thread 的完成构造与正在创建的线程中指定函数的调用同步,即保证f4 在构造std::thread th 之前发生的所有事情当新线程开始执行f3 时对它可见。特别是在f4 (g_w = p_s;) 中对g_w 的写入将对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 上没有数据竞争。

【讨论】:

  • 由于这里添加评论的空间太有限,无法表达我的意见,所以我将我的问题作为另一个答案发布。
【解决方案2】:

@凯西

首先,我完成我的代码。

int main()
{
  f4();
  getchar();
  retrun 0;
}

我在我的 Visual Studio 2013 中找到了一些代码。

【讨论】:

  • 如果您查看weak_ptr 赋值运算符,您应该看到weak_ptrs 通过递增_Weaks 持有对控制块的引用。当最后一个 shared_ptr 被销毁时,共享对象可能会被释放,但具有引用计数的控制块将一直存在,直到最后一个 weak 指针被销毁。
  • 真的,谢谢你的帮助。我只注意到_Uses,但没有注意到_Weaks。所以在另一个问题中(stackoverflow.com/questions/20705304/… 只在 main 中调用 f4() 没有种族,对吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多