有原子lambda表达式吗?

时间:2018-02-16 07:55:49

标签: c++ multithreading concurrency stl atomic

我想定义一个互斥锁并在其上执行一个lambda表达式。有没有办法在STL中简明扼要地做到这一点?

我在寻找:

  std::atomic<MyPointer*> myAtomic;
  myAtomic.call([&](int var1, int var2) { /* some code */ }, val1, val2);

我不想要的东西:

  std::mutex myMutex;
  MyPointer* myPointer = new MyPointer();
  myMutex.lock();
  // some code
  myMutex.unlock();

基本上,我希望atomic在调用它之前/之后获取lambda表达式并锁定/解锁。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

Atomic可以自动处理其界面中定义的操作。

所以你可以拥有一个原子指针并确保其值以原子方式递增或替换。您甚至可以拥有自己类型的原子对象,然后确保以原子方式复制。 Atomic可以使用原子cpu操作或场景后面的任何类型的锁定来符合规范(取决于实现)。

但是,原子性不会扩展到指向的对象,也不会扩展到在原子对象上调用的任何其他状态更改操作。

所以答案是否定的,你必须使用互斥锁,最好是通过lock_guard(所以即使在例外的情况下也要确保锁定释放)。