c++ - 使用 std::mutex 复制类

标签 c++ c++11

我有一个以 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/

相关文章:

c++通过多个函数传递nullptr

c++ - gethostname() 给出退出状态 -1 我该如何处理?

c++ - 删除指针数组

c++ - 使用回调重载operator=()

c++ - "cannot access private member' "只有当类有导出链接时才会出错

c++ - getrusage 没有像我预期的那样工作

c++ - 如何有效地使用 std::async 对指针数组执行操作

c++ - 解析旋转矩阵以获得角度

c++ - 区别: std::make_unique<char>(size_t size) 和 std::make_unique<char[]>(size_t size)?

c++ - 创建 boost::asio::ip::address_v4