使用 std::mutex 复制类

新手上路,请多包涵

我有一个以 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 个选择中的正确语法是什么。请帮忙。

原文由 bhavesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

简短的回答你不复制互斥锁。

让我们从基础开始,互斥锁是互斥的简称,即您要确保,当有多个线程时,您不希望它们并行更改/修改值。您想要序列化访问或修改/读取,以便读取的值有效。

在上述情况下,您正在将新值复制到变量中。在这种情况下,您无需使用互斥锁,因为您正在创建新对象。

原文由 Pradheep 发布,翻译遵循 CC BY-SA 3.0 许可协议

你不应该写任何这些行。您对复制构造函数的实现等效于:

 C (const C &c) : x(), m()
{
   x = c.x;
}

因此,互斥锁的新实例 m默认初始化 的,这意味着将调用默认构造函数之一。它可以安全使用。

但是,关于此代码有几个问题。即如果 m 保护 x ,您应该在访问值之前明确锁定它:

 C (const C &c)
{
    std::lock_guard<std::mutex> guard(c.m);
    x = c.x;
}

这需要将 m 声明为可变(因为 c 是复制 ctor 中的常量引用)。

 mutable std::mutex m;

最后,您可以看到复制带有互斥锁的对象是令人困惑的,如果 C 是公共类,它会混淆它的用户,所以在实现它的复制之前要三思而后行。

原文由 myaut 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题