【发布时间】:2012-07-30 13:18:20
【问题描述】:
我需要(在 C++ 中)实现一个线程安全容器,使得只有一个线程能够从容器中添加或删除项目。我以前通过在线程之间共享互斥体来完成这种事情。这导致在我的代码中散落大量互斥对象,使事情变得非常混乱且难以维护。
我想知道是否有一种更简洁、更面向对象的方式来执行此操作。我想到了以下围绕容器的简单类包装器(半伪 C++ 代码)
class LockedList {
private:
std::list<MyClass> m_List;
public:
MutexObject Mutex;
};
这样就可以通过以下方式进行锁定
LockedList lockableList; //create instance
lockableList.Mutex.Lock(); // Lock object
... // search and add or remove items
lockableList.Mutex.Unlock(); // Unlock object
所以我的问题真的是问从设计的角度来看,这是否是一个好方法?我知道从设计的角度来看,允许公众访问成员是不受欢迎的,上述设计是否有任何严重的缺陷。如果是这样,是否有更好的方法来实现线程安全的容器对象?
我读过很多关于设计和 C++ 的书籍,但似乎确实缺乏关于多线程编程和多线程软件设计的文献。
如果上述方法是解决问题的糟糕方法,我是否可以提出一种改进方法,或者向我指出一些解释设计线程安全的类的好方法的信息?非常感谢。
【问题讨论】:
-
谁在乎“更面向对象”?这需要“更多的 RAII”。
-
发布的代码不是异常安全的。如果搜索、添加或删除操作引发异常,则互斥锁未解锁。提供作用域的锁定-解锁机制有助于避免这种情况。
-
那你不应该问你的老板这个代码是否可以接受吗?似乎他的意见才是最重要的
-
为什么你的老板会规定你如何编写代码?那他为什么不自己写呢?
-
@mathematician1975 当然,这些都是很好的目标。但它们并不一定意味着“更面向对象”。 OOP 只是尝试实现其中一些目标的几种方法之一。但重要的是目标,而不是 OOP。如果另一种范式可以让您更好地实现这些目标,那么唯一明智的做法就是说“screw OOP”
标签: c++ multithreading oop thread-safety