我知道这与其说是一个问题,不如说是一个讨论,但我相信可以提供一个或多个答案,所以现在开始吧。
我有这样一个类
class MyAwesomeObject {
public:
std::mutex theListMutex;
std::list<int> theList;
};
现在,我相信意图非常明显,而且这个例子是故意学术性的——尽管与我的现实相去不远——所以让我们继续吧。然后我的应用程序处理大量这样的对象,所有这些对象都存储在其他地方的 vector 中,一切都很好。当我编译时,麻烦就开始了。我正在使用 VS2012,但我相信其他编译器可能会发出类似的错误:
error C2248: 'std::mutex::mutex' : cannot access private member declared in class 'std::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> This diagnostic occurred in the compiler generated function 'MyApp::MyAwesomeObject ::MyAwesomeObject (const MyApp::MyAwesomeObject &)'
这意思对我来说很清楚,在 SO 中经历了很多其他问题,所有这些基本上都说“无法复制互斥体”,我对此很好。所以到目前为止我的策略是让互斥体成为 shared_ptr<mutex>
并完成它。唯一的“缺点”是,现在我在访问互斥量时必须使用愚蠢的取消引用语法,这当然一点也不愚蠢,只是有点笨拙并且在我使用的所有其他点符号之间有点突出这个地方。
现在,回到我的问题:使用共享指针是解决问题的正确方法吗?可能我改用了一个唯一的指针,因为据我所知我没有将所有权转让给其他任何人(除非在作为对象成员的指针上调用方法实际上是所有权转让的一种形式)?是否有其他方法可以解决无法复制互斥体的问题?
最佳答案
So my strategy so far has been to make the mutex a
shared_ptr<mutex>
等等。为什么互斥量会在各种实例之间共享?你知道这最终保护了不止一个 theList
使用相同的互斥体?
你不能只删除 shared_ptr
就事论事,假装它能解决问题。在这种情况下,它改变了语义。我希望这里的正确语义是:每个新的 MyAwesomeObject
对象将有自己的互斥锁来保护自己的 theList
.
关于c++ - 标准 :mutex'es as members of objects that will go into containers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487192/