【问题标题】:Is there an atomic lambda expression?有原子 lambda 表达式吗?
【发布时间】:2018-07-27 02:27:03
【问题描述】:

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

【问题讨论】:

  • 你为什么要这个?这段代码的一般用例是什么?
  • 简短回答是“否”。 std::atomic 不支持任何抓取互斥体,调用调用者指定的函数,然后释放互斥体的操作。如果您真的想做这样的事情,请实现您自己的类以提供所需的逻辑。我怀疑是否有必要 - 您唯一的动机似乎是避免将代码包装在互斥体中。
  • 我不明白。 myAtomic.call 是什么?原子有storeload,但没有call。变量myAtomic 是指向MyPointer 的指针。 MyPointer 有什么属性?互斥量在哪里?更加仔细。

标签: c++ multithreading concurrency stl atomic


【解决方案1】:

Atomic 用于以原子方式处理其接口中定义的操作。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多