我有点意识到这不是一个问题,而是一个讨论,但我相信可以提供一个或多个答案,所以你去吧。
我有这样的课
class MyAwesomeObject {
public:
std::mutex theListMutex;
std::list<int> theList;
};
现在,我相信意图很明显,而且这个例子是故意的学术性的——虽然离我的现实不远——所以让我们继续吧。然后我的应用程序处理了大量这样的对象,所有这些对象都存储在其他地方的向量中,一切都很好。当我编译时,麻烦就开始了。我正在使用 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 中经历了很多其他问题,所有这些基本上都说“互斥锁不能被复制”,我很好。所以到目前为止,我的策略是制作互斥体 ashared_ptr<mutex>
并完成它。唯一的“缺点”是现在我在访问互斥锁时必须使用愚蠢的取消引用语法,这当然一点也不愚蠢,只是在我使用的所有其他点符号之间有点尴尬和突出这个地方。
现在,关于我的问题:使用共享指针是解决问题的正确方法吗?可能我使用了唯一的指针,因为据我所知,我没有将所有权转移给其他任何人(除非在作为对象成员的指针上调用方法实际上是所有权转移的一种形式)?还有其他方法可以解决无法复制互斥锁的事实吗?