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

Does std::tr1::shared_ptr do mutual exclusion?

本文关键字:是否 tr1 shared std ptr      更新时间:2023-10-16

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

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

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

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

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

确保正确访问std::tr1::shared_ptr所指向的数据取决于您。这些数据是你的。只有当需要删除std::tr1::shared_ptr时,它才会起作用。

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

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

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

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