首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全容器

线程安全容器
EN

Stack Overflow用户
提问于 2011-10-07 15:49:10
回答 4查看 5.4K关注 0票数 8

在伪代码中有一些典型的容器类:

代码语言:javascript
复制
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++中,什么库可以完成这个任务?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-07 15:58:38

首先,只要你要使用多个实例,互斥量对于一个类来说不应该是静态的。在很多情况下,你应该或不应该使用它们。所以,如果不看你的代码,就很难说。请记住,它们用于同步对共享数据的访问。因此,明智的做法是将它们放在修改或依赖对象状态的方法中。在您的例子中,我将使用一个互斥锁来保护整个对象并锁定所有三个方法。像这样:

代码语言:javascript
复制
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;
};
票数 8
EN

Stack Overflow用户

发布于 2011-10-07 15:56:05

英特尔线程构建块(TBB)为C++提供了大量线程安全的容器实现。它是开源的,你可以从http://threadingbuildingblocks.org/ver.php?fid=174下载。

票数 4
EN

Stack Overflow用户

发布于 2011-10-07 16:12:33

添加mutex作为class的实例变量。在构造函数中初始化它,并在每个方法的开始处锁定它,包括析构函数,并在方法的末尾解锁。为类的所有实例(静态成员或仅在全局范围内)添加全局互斥可能会降低性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7684428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档