gpt4 book ai didi

c++ - 这很可怕吗?可复制的互斥量以保护类成员

转载 作者:行者123 更新时间:2023-11-30 02:50:48 24 4
gpt4 key购买 nike

我正在尝试通过使用互斥体使类线程安全。

class Container
{
private:
vector<Foo> v;
boost::mutex m;
public:
void add(Foo item)
{
m.lock();
v.push_back(item);
m.unlock();
}
};

问题是 boost::mutex 是不可复制的,所以这使得 Container 不可复制。当然,如果我复制 Container,新实例可能不需要与旧实例保持相同的互斥锁——它可以拥有自己的新互斥锁。我可以为 Container 编写自定义复制构造函数来执行此操作,但实际上它是一个复杂的类,我不想这样做。那么这个怎么样:

class CopyableMutex
{
private:
boost::mutex m;
public:
CopyableMutex() {}
CopyableMutex(CopyableMutex&) {} //don't copy, just create a new one
CopyableMutex& operator=(CopyableMutex&) {return *this;} //don't assign, keep it the same
void lock() {m.lock();}
void unlock() {m.unlock();}
};

...然后将 Container 中的 boost::mutex 替换为 CopyableMutex

这是一件可怕的事情吗?如果不是,那我是不是在重新发明轮子 - 是否已经有一个库类可以做到这一点?

最佳答案

是的,这很可怕。

该问题的正确解决方案是为您的容器自定义复制构造函数和赋值运算符。

如果该类“太复杂”而无法为其编写自定义复制构造函数,则将线程安全与容器分离,并拥有不包含互斥量的基类容器,也许派生类“线程安全” container”,它包含一个互斥锁,并具有一个自定义的复制构造函数和赋值操作,它们只调用自动生成的基类。

关于c++ - 这很可怕吗?可复制的互斥量以保护类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com