线程安全容器

scd*_*dmb 8 c++ multithreading

伪代码中有一些示例性的容器类:

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;
};
Run Code Online (Sandbox Code Playgroud)

如何使这个容器成为线程安全的?我听说过互斥体 - 应该放置这些互斥体?互斥是静态的,还是全局的?在C++中,这个任务有什么好的库?

Gre*_*ape 8

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

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 这有正确的想法,但不是明确地管理互斥锁解锁,你应该使用**RAII**,在Mutex类之上写一个包装器,当示波器结束时它将隐式解锁互斥锁. (2认同)
  • @Max,是的,但另一种选择是你有一个死锁,因为没有什么能解锁那个互斥锁. (2认同)