可以由多个线程调用shared_ptr.get(),而另一个线程锁定并调用shared_ptr.swap()吗?

马拉松

我想知道shared_ptr是否安全。请原谅我的伪代码:

Thread 1:
do lock
ReadOnlyObj obj = make_shared<ReadOnlyObj>();
some_shared_ptr.swap(obj);
do unlock

Thread 2-N:
//no lock
some_shared_ptr->getterOnObj();

CPP参考资料说

多个线程可以在shared_ptr的不同实例上调用所有成员函数(包括副本构造函数和副本分配),而无需额外同步,即使这些实例是副本并共享同一对象的所有权。如果多个执行线程在不同步的情况下访问同一个shared_ptr,并且其中任何访问使用了shared_ptr的非常量成员函数,则将发生数据争用,原子函数的shared_ptr重载可用于防止数据争用。

但是,根据GNU文档

Boost shared_ptr(在GCC中使用)具有一种巧妙的无锁算法来避免出现竞争情况,但这依赖于处理器支持原子的Compare-And-Swap指令。对于其他平台,存在使用互斥锁的后备功能。Boost(从1.35版开始)包括几种不同的实现,预处理器根据编译器,标准库,平台等选择一种。对于libstdc ++中shared_ptr的版本,编译器和库是固定的,这使事情变得简单得多:原子CAS或我们不知道,有关详细信息,请参见下面的“锁定策略”。

据我所知,英特尔x86_64支持CAS。

所以,对我的问题:

shared_ptr :: swap是非常量的。get和->()是常量。给定上面列出的使用场景,我是否也必须锁定get /->?

马拉松

我想我自己在boost文档中找到了答案

//--- Example 3 ---

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

// thread B
p3.reset(); // writes p3; undefined, simultaneous read/write

我想做的是同时读写,这是不确定的/不安全的。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

shared_ptr交换线程安全吗?

来自分类Dev

线程安全地分配shared_ptr nullptr吗?

来自分类Dev

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

来自分类Dev

线程安全地分配shared_ptr nullptr吗?

来自分类Dev

shared_ptr的原始指针构造函数是一个错误吗?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将一个shared_ptr分配给另一个

来自分类Dev

在shared_ptr的向量上调用clear()。会释放内存吗?

来自分类Dev

C ++ Shared_Ptr不共享吗?

来自分类Dev

使用从另一个具体类返回的shared_ptr

来自分类Dev

使用从另一个具体类返回的shared_ptr

来自分类Dev

使用shared_ptr在类及其成员对象之间共享变量是一个好的解决方案吗?

来自分类Dev

我应该总是使用 shared_ptr 来创建一个类实例(而不是新的)吗?

来自分类Dev

从unique_ptr创建一个shared_ptr

来自分类Dev

一个线程可以中断另一个线程吗?

来自分类Dev

我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

来自分类Dev

我可以在所有想使用简单指针的地方使用shared_ptr吗?

来自分类Dev

我可以在不知道type参数的情况下持有shared_ptr吗?

来自分类Dev

我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

来自分类Dev

您可以在同一对象中具有对成员std :: shared_ptr <variable>的成员引用吗?

来自分类Dev

我可以在向量中使用“ unique_ptr”吗,还是需要切换到“ shared_ptr”?

来自分类Dev

仅剩一个引用时,删除由shared_ptr管理的对象

来自分类Dev

我应该如何构造一个打算由std :: shared_ptr管理的实例?

来自分类Dev

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

来自分类Dev

将shared_ptr辅助自身安全吗?

来自分类Dev

通过shared_ptr进行dynamic_cast吗?

来自分类Dev

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

来自分类Dev

如何简洁地创建一个shared_ptr?

Related 相关文章

  1. 1

    shared_ptr交换线程安全吗?

  2. 2

    线程安全地分配shared_ptr nullptr吗?

  3. 3

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

  4. 4

    线程安全地分配shared_ptr nullptr吗?

  5. 5

    shared_ptr的原始指针构造函数是一个错误吗?

  6. 6

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

  7. 7

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

  8. 8

    将一个shared_ptr分配给另一个

  9. 9

    在shared_ptr的向量上调用clear()。会释放内存吗?

  10. 10

    C ++ Shared_Ptr不共享吗?

  11. 11

    使用从另一个具体类返回的shared_ptr

  12. 12

    使用从另一个具体类返回的shared_ptr

  13. 13

    使用shared_ptr在类及其成员对象之间共享变量是一个好的解决方案吗?

  14. 14

    我应该总是使用 shared_ptr 来创建一个类实例(而不是新的)吗?

  15. 15

    从unique_ptr创建一个shared_ptr

  16. 16

    一个线程可以中断另一个线程吗?

  17. 17

    我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

  18. 18

    我可以在所有想使用简单指针的地方使用shared_ptr吗?

  19. 19

    我可以在不知道type参数的情况下持有shared_ptr吗?

  20. 20

    我可以定义从std :: function到std :: shared_ptr <MyClass>的隐式转换吗?

  21. 21

    您可以在同一对象中具有对成员std :: shared_ptr <variable>的成员引用吗?

  22. 22

    我可以在向量中使用“ unique_ptr”吗,还是需要切换到“ shared_ptr”?

  23. 23

    仅剩一个引用时,删除由shared_ptr管理的对象

  24. 24

    我应该如何构造一个打算由std :: shared_ptr管理的实例?

  25. 25

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

  26. 26

    将shared_ptr辅助自身安全吗?

  27. 27

    通过shared_ptr进行dynamic_cast吗?

  28. 28

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

  29. 29

    如何简洁地创建一个shared_ptr?

热门标签

归档