我想定义一个互斥锁并在其上执行一个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表达式并锁定/解锁。有没有办法做到这一点?
答案 0 :(得分:3)
Atomic可以自动处理其界面中定义的操作。
所以你可以拥有一个原子指针并确保其值以原子方式递增或替换。您甚至可以拥有自己类型的原子对象,然后确保以原子方式复制。 Atomic可以使用原子cpu操作或场景后面的任何类型的锁定来符合规范(取决于实现)。
但是,原子性不会扩展到指向的对象,也不会扩展到在原子对象上调用的任何其他状态更改操作。
所以答案是否定的,你必须使用互斥锁,最好是通过lock_guard(所以即使在例外的情况下也要确保锁定释放)。