我想定义一个互斥锁并在其上执行一个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/