【问题标题】:How to make shared_ptr thread safe in this case?在这种情况下如何使 shared_ptr 线程安全?
【发布时间】:2015-09-22 12:08:02
【问题描述】:

在 boost doc(Shared_ptr doc) 中,我看到有一个线程不安全的例子:

//--- Example 4 ---

// thread A
p3 = p2; // reads p2, writes p3

// thread B
// p2 goes out of scope: undefined, the destructor is considered a "write access"

如何处理这种情况?如果 p2 超出范围,我该如何控制?

【问题讨论】:

  • 如果我们知道想要做什么会更有帮助。

标签: c++ boost thread-safety shared-ptr


【解决方案1】:

相同的规则适用于(几乎)所有类型:如果它们在另一个线程中被销毁,则不要在一个线程中访问它们。

同样的解决方案也适用:使用互斥锁或原子操作来同步对线程间共享变量的并发访问。

【讨论】:

    【解决方案2】:

    从 C++11 开始尝试atomic_store http://www.cplusplus.com/reference/atomic/atomic_store/

    例子:

    atomic_store(&p3, p2);
    

    更多示例:

    // thread A
    p3 = atomic_load(&p2);
    ...
    
    // thread B
    atomic_store(&p2, make_shared<Foo>());
    

    【讨论】:

    • 只有在对p3 的所有访问都使用相关的原子函数完成时,这才是线程安全的。
    • @JonathanWakely 这是真的。谢谢你的观点。我已经决定使用互斥锁的解决方案是显而易见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2011-12-15
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多