std :: tr1 :: shared_ptr是否互相排斥?

时间:2011-08-24 20:51:25

标签: c++ windows shared-ptr mutual-exclusion

我有一个包含BYTE*的类,一个引用计数器和一个CRITICAL_SECTION,它可以保护它们不受并发访问的影响。

我想用std::tr1::shared_ptr<BYTE>替换所有内容。 MSDN说:

  

多个线程可以读取和写入不同的shared_ptr对象   同时,即使对象是共享所有权的副本。

一切听起来都不错,直到我发现班级中的CRITICAL_SECTION被用在它之外来“锁定”它并以互斥的方式改变它的内容。好吧,它打破了封装,我想改变它。

我知道shared_ptr保证释放内存,但是当你写入内存时它是否保证互斥?

1 个答案:

答案 0 :(得分:5)

由您来确保正确访问std::tr1::shared_ptr指向的数据。该数据是你的。只有当{@ 1}}删除它时才重要。

关于std::tr1::shared_ptr对象本身,您有以下保证:

  • 您可以安全地从多个线程中读取相同实例;
  • 您可以安全地从多个线程中突变 std::tr1::shared_ptr即使实例是副本(共享相同的引用计数或其他); < / LI>

任何其他同时访问(例如同时读取和写入同一实例)是未定义的行为。

另请注意,新C ++ 11标准中的shared_ptr具有用于原子访问的特殊API。