2011-08-24 134 views
1

我有一个类,它包含一个BYTE*,一个参考计数器和一个CRITICAL_SECTION,它可以保护他们免受并发访问。std :: tr1 :: shared_ptr是否互斥?

我想用std::tr1::shared_ptr<BYTE>替换所有这些。该MSDN说:

多个线程可以读取和写入 不同shared_ptr对象的同时,即使对象是股权份。

一切听起来都很好,直到我发现来自该类的CRITICAL_SECTION在它之外被用来“锁定”它并以互斥的方式改变它的内容。好吧,它是休息封装,我想改变它。

我知道shared_ptr保证内存将被释放,但它确保当您写入内存时互斥?

+1

'shared_ptr'不知道你对它指向的对象做了什么。所有你保证的是,即使在同时使用时,共享指针容器本身也能正常工作。 –

回答

5

这是由您来确保正确访问数据std::tr1::shared_ptr指向。那数据是你的。它只在std::tr1::shared_ptr时才需要删除它。

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

  • 您可以安全地从多个线程相同的实例阅读;
  • 你可以安全地变异不同情况下的shared_ptr从多个线程即使实例是拷贝(共享相同的引用计数或其他);

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

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

+0

“它保证互相排斥”是什么意思? –

+0

@Kerrek:nothing;) –

+0

我明白'shared_ptr'的数据成员是线程安全的,而“外部”数据,也就是传递给'shared_ptr'构造函数的指针所指向的数据不是。我对吗? –

相关问题