1

我有一个包含 a BYTE*、一个引用计数器和 a的类,CRITICAL_SECTION它保护它们免受并发访问。

我想用std::tr1::shared_ptr<BYTE>. MSDN说:

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

一切听起来都很好,直到我发现CRITICAL_SECTIONfrom 类在它之外被用来“锁定”它并以互斥的方式改变它的内容。好的,它破坏了封装,我想改变它。

我知道shared_ptr保证内存会被释放,但是写内存时能保证互斥吗?

4

1 回答 1

5

您可以确保正确访问指向的数据std::tr1::shared_ptr。该数据是的。它只对std::tr1::shared_ptr何时删除它很重要。

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

  • 您可以安全地从多个线程中读取同一实例;
  • 即使实例是副本(共享相同的引用计数或其他),您也可以安全地改变来自多个线程的不同实例;shared_ptr

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

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

于 2011-08-24T20:54:39.057 回答