我想通過使用互斥體使類安全線程安全。這是可怕的嗎?可複製的互斥體,以保護類成員
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();}
};
...,然後用CopyableMutex
更換boost::mutex
在Container
。
這是一件可怕的事情嗎?如果不是,那麼我是否重新發明了輪子 - 有沒有一個圖書館班已經這樣做了?
如果您想要指出所有的C++都是可怕的,那麼您可以用'糟糕的想法'替換'可怕的'(fsvo語法):) –
如果您只需要那個'Container'類中的那個類型,一個私有的嵌套類(沒有濫用可能)。否則,請在* name *中清除它不是可複製的互斥鎖(不滿足'CopyableMutex a; CopyableMutex b(a); assert(a == b);'),而是一個* create-new- on-invoking-copy-mutex *(這是一個可怕的名字;) – dyp