我有一个以 std::mutex 作为成员的类。我正在尝试创建此类的数组
class C
{
int x;
std::mutex m;
};
int main()
{
C c[10];
//later trying to create a temp C
C temp = c[0];
}
显然上述情况是不可能的,因为互斥对象是不可复制的。解决方法是通过拷贝构造函数。
但是,我在创建复制构造函数时遇到了问题。我试过了
C (const C &c)
{
x = c.x;
//1. m
//2. m()
//3. m = c.m
}
我不确定这 3 个选项中哪个是正确的语法。请帮忙。
最佳答案
你不应该写任何这些行。您的复制构造函数的实现等同于:
C (const C &c) : x(), m()
{
x = c.x;
}
所以新的互斥量 m
实例是 default initialized这意味着将调用默认构造函数之一。它可以安全使用。
但是,关于这段代码有几个问题。 IE。如果 m
保护 x
,您应该在访问值之前明确锁定它:
C (const C &c)
{
std::lock_guard<std::mutex> guard(c.m);
x = c.x;
}
这需要将 m
声明为可变的(因为 c
是复制构造函数中的常量引用)。
mutable std::mutex m;
最后,你可以看到复制内部有互斥量的对象是令人困惑的,如果 C
是公共(public)类,它会让它的用户感到困惑,所以在实现复制之前三思而后行。
关于c++ - 使用 std::mutex 复制类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340029/