在伪代码中有一些典型的容器类:
class Container
{
public:
Container(){}
~Container(){}
void add(data new)
{
// addition of data
}
data get(size_t which)
{
// returning some data
}
void remove(size_t which)
{
// delete specified object
}
private:
data d;
};如何使这个容器成为线程安全的容器?我听说过互斥锁--这些互斥锁应该放在哪里?互斥量应该在类中是静态的,还是在全局范围内?在C++中,什么库可以完成这个任务?
发布于 2011-10-07 15:58:38
首先,只要你要使用多个实例,互斥量对于一个类来说不应该是静态的。在很多情况下,你应该或不应该使用它们。所以,如果不看你的代码,就很难说。请记住,它们用于同步对共享数据的访问。因此,明智的做法是将它们放在修改或依赖对象状态的方法中。在您的例子中,我将使用一个互斥锁来保护整个对象并锁定所有三个方法。像这样:
class Container
{
public:
Container(){}
~Container(){}
void add(data new)
{
lock_guard<Mutex> lock(mutex);
// addition of data
}
data get(size_t which)
{
lock_guard<Mutex> lock(mutex);
// getting copy of value
// return that value
}
void remove(size_t which)
{
lock_guard<Mutex> lock(mutex);
// delete specified object
}
private:
data d;
Mutex mutex;
};发布于 2011-10-07 15:56:05
英特尔线程构建块(TBB)为C++提供了大量线程安全的容器实现。它是开源的,你可以从http://threadingbuildingblocks.org/ver.php?fid=174下载。
发布于 2011-10-07 16:12:33
添加mutex作为class的实例变量。在构造函数中初始化它,并在每个方法的开始处锁定它,包括析构函数,并在方法的末尾解锁。为类的所有实例(静态成员或仅在全局范围内)添加全局互斥可能会降低性能。
https://stackoverflow.com/questions/7684428
复制相似问题