线程安全地分配shared_ptr nullptr吗?

扎克

假设有一个shared_ptr:

std::shared_ptr<MyClass> myPtr = std::make_shared(new MyClass());

在工作线程中:

myPtr = nullptr;

在主线程中:

if( myPtr != nullptr )
{
    // do something
}

线程上方的代码安全吗?还是主线程可以立即看到新值?

ComicSansMS

不,这不是线程安全的。

shared_ptr关于线程安全,A的行为类似于内置类型:并发访问不同的对象很好,而并发访问同一对象则不是。也就是说,多个线程可以shared_ptr按自己的喜好操纵指向同一对象的不同s。但是,一旦分享shared_ptr自己,事情就会变得很危险。

使用原子非成员函数可以shared_ptr同时从多个线程访问同一对象:

// atomically set myPtr to nullptr
std::atomic_store(&myPtr, std::shared_ptr<MyClass>{});
[...]


// atomically check the current value of myPtr
if(std::atomic_load(&myPtr) != nullptr) [...]

请注意,这仅在所有shared_ptr通过原子函数访问唯一线程的线程起作用的情况才有效。否则,您可能仍然会进行数据争夺。为了使此限制在源代码中更明确,C ++ 20引入std::atomic<std::shared_ptr>了旧自由函数的专用化,并且不赞成使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程安全地分配shared_ptr nullptr吗?

来自分类Dev

shared_ptr交换线程安全吗?

来自分类Dev

同时重置和复制shared_ptr线程安全吗?

来自分类Dev

可以安全地将先前存在的typecast NULL返回与较新的nullptr进行比较吗?

来自分类Dev

将shared_ptr辅助自身安全吗?

来自分类Dev

有通过引用分配shared_ptr的用例吗?

来自分类Dev

shared_ptr 的复制分配会导致分段错误吗?

来自分类Dev

C++:`this == nullptr` 在成员函数中安全吗?

来自分类Dev

HttpClient:我可以通过多个线程安全地在不同域中重用HttpContext吗?

来自分类Dev

我可以在多线程C ++中安全地使用int吗?

来自分类Dev

多个线程可以安全地同时将相同的值写入相同的变量吗?

来自分类Dev

我可以在单线程上下文中安全地使用 Ordering::Relaxed 吗?

来自分类Dev

我可以安全地指向重新分配的boost :: optional的数据吗?

来自分类Dev

(更多)使用NA默认值安全地预分配数字矢量吗?

来自分类Dev

我可以安全地向“系统保留”分区中分配字母或隐藏东西吗?

来自分类Dev

我可以安全地访问可能未分配的内存地址吗?

来自分类Dev

在C ++线程中,我应该按值或引用传递shared_ptr吗?

来自分类Dev

在C ++线程中,我应该按值或引用传递shared_ptr吗?

来自分类Dev

没有办法默默地创建shared_ptr吗?

来自分类Dev

线程可以先通过安全发布获取对象,然后不安全地发布对象吗?

来自分类Dev

在nullptr上调用OpenSSL BIO / EC_KEY / EVP_KEY /..._ free函数安全吗?

来自分类Dev

C ++ Shared_Ptr不共享吗?

来自分类Dev

我可以从多个线程的ArrayList中获取迭代器并安全地使用所有迭代器吗?

来自分类Dev

我可以安全地删除Ubuntu 12.04分区并为Elementary OS使用未分配的空间吗?

来自分类Dev

我可以安全地消毒textarea吗

来自分类Dev

我可以安全地添加新分区吗?

来自分类Dev

可以安全地自动扩大〜3吗?

来自分类Dev

循环时可以安全地附加到文件吗?

来自分类Dev

以下javascript安全地执行任意代码吗?

Related 相关文章

  1. 1

    线程安全地分配shared_ptr nullptr吗?

  2. 2

    shared_ptr交换线程安全吗?

  3. 3

    同时重置和复制shared_ptr线程安全吗?

  4. 4

    可以安全地将先前存在的typecast NULL返回与较新的nullptr进行比较吗?

  5. 5

    将shared_ptr辅助自身安全吗?

  6. 6

    有通过引用分配shared_ptr的用例吗?

  7. 7

    shared_ptr 的复制分配会导致分段错误吗?

  8. 8

    C++:`this == nullptr` 在成员函数中安全吗?

  9. 9

    HttpClient:我可以通过多个线程安全地在不同域中重用HttpContext吗?

  10. 10

    我可以在多线程C ++中安全地使用int吗?

  11. 11

    多个线程可以安全地同时将相同的值写入相同的变量吗?

  12. 12

    我可以在单线程上下文中安全地使用 Ordering::Relaxed 吗?

  13. 13

    我可以安全地指向重新分配的boost :: optional的数据吗?

  14. 14

    (更多)使用NA默认值安全地预分配数字矢量吗?

  15. 15

    我可以安全地向“系统保留”分区中分配字母或隐藏东西吗?

  16. 16

    我可以安全地访问可能未分配的内存地址吗?

  17. 17

    在C ++线程中,我应该按值或引用传递shared_ptr吗?

  18. 18

    在C ++线程中,我应该按值或引用传递shared_ptr吗?

  19. 19

    没有办法默默地创建shared_ptr吗?

  20. 20

    线程可以先通过安全发布获取对象,然后不安全地发布对象吗?

  21. 21

    在nullptr上调用OpenSSL BIO / EC_KEY / EVP_KEY /..._ free函数安全吗?

  22. 22

    C ++ Shared_Ptr不共享吗?

  23. 23

    我可以从多个线程的ArrayList中获取迭代器并安全地使用所有迭代器吗?

  24. 24

    我可以安全地删除Ubuntu 12.04分区并为Elementary OS使用未分配的空间吗?

  25. 25

    我可以安全地消毒textarea吗

  26. 26

    我可以安全地添加新分区吗?

  27. 27

    可以安全地自动扩大〜3吗?

  28. 28

    循环时可以安全地附加到文件吗?

  29. 29

    以下javascript安全地执行任意代码吗?

热门标签

归档