【问题标题】:Is there a cleaner way to define my copy ctor with a mutex?有没有更简洁的方法来使用互斥锁定义我的复制 ctor?
【发布时间】:2020-10-07 17:02:58
【问题描述】:

我有一个像这样的 POD 结构

struct foo {
  std::mutex m_foo_mutex;
  int a;
  int b;
  int c;
  //......
};

它有比这更多的字段,但结构应该很明显。当然,默认的复制 ctor 格式不正确,因为 std::mutex 的复制 ctor 是 delete

复制这个对象并给复制的对象一个新的互斥体对我来说非常好。所以我在foo 中定义了类似的东西。

foo(const foo &foo2) : m_foo_mutex() {
a = foo2.a;
b = foo2.b;
c = foo2.c;
//.......
}

这一切都很好,但是当这个结构有 20 多个字段时它就很丑了,通常编译器会对我隐藏它。有没有更简洁的方式来表达这一点,还是我被这个又大又丑的构造函数卡住了?

【问题讨论】:

  • 为什么你不能把你的班级分成 _unsafe (POD) 和 safe {mutex + pod)?
  • 我可能不清楚你的意思 - 但安全类不会还有这个问题吗?或者你的意思是安全类是不可复制的,而 _unsafe 类没有互斥锁?
  • 该结构不是 POD!
  • 你的例子看起来不像平常。通常我们使互斥体成员可变,并在复制构造函数中锁定源对象的互斥体,以实现在复制时没有其他线程争相写入它。所以编译器无论如何也无法生成它。
  • 您遇到的问题是设计缺陷的信号。

标签: c++ copy-constructor


【解决方案1】:

你可以只将你的互斥锁包装在一个可复制的类中:

struct CopyableMutex {
    std::mutex mutex;

    CopyableMutex() = default;
    CopyableMutex(const CopyableMutex&) {};
    CopyableMutex& operator= (const CopyableMutex&) {
        return *this;
    };
};

struct foo {
  CopyableMutex m_foo_mutex;
  int a;
  int b;
  int c;
};

不过,您可能想想出一个比 CopyableMutex 更好的名称,因为显然它实际上并不是在复制互斥锁!

【讨论】:

  • 你好,把困难的部分留给 OP。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2013-10-18
  • 2016-02-15
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多