c++ - 标准 :mutex'es as members of objects that will go into containers?

标签 c++ c++11 mutex smart-pointers

我知道这与其说是一个问题,不如说是一个讨论,但我相信可以提供一个或多个答案,所以现在开始吧。

我有这样一个类

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/

相关文章:

c++ - 将字符串转换为清晰的整数

c++ - 如何在不同的类中使用 QNetworkAccessManager?类之间重要数据的一般共享?

c++ - 我可以将 c++ sanitizer 仅应用于我的程序部分而不是第三方库吗

c++ - 在运行时获取命名空间中的函数列表?

c++ - Orwell Dev C++ 不适用于 C++11

c++ - 如何像普通 C 函数一样使用正确的 'this' 指针调用 C++ 类成员函数? (指向类成员函数的指针)

c# - 在 C# 中使用 C++ dll

rust - 为什么不能将借入的值放在互斥对象后面并将其传递给另一个线程?

C++ - 进程间共享的互斥量

c++ - 我可以在多线程情况下使用不带锁的char变量吗