我想定义一个互斥锁并在其上执行一个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表达式并在调用它之前/之后对其进行锁定/解锁。有没有办法做到这一点?

最佳答案

原子在那里原子地处理在其接口(interface)中定义的操作。

因此,您可以拥有一个原子指针,并确保其值原子地递增或替换。您甚至可以拥有自己类型的原子对象,然后确保将其原子复制。原子可以使用原子cpu操作或在后台进行任何类型的锁定来符合规范(取决于实现)。

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

因此答案是否定的,您将必须使用互斥锁,最好通过lock_guard使用(这样即使在发生异常情况下也可以确保释放锁)。

关于c++ - 是否有原子lambda表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48822356/

10-15 10:54