C ++

是否有可能使用c ++ 11原子操作安全地移动unique_ptr?

目前我有这样的代码

std::unique_ptr<SyncToken> DataManager::borrowSyncToken()
{
    std::unique_lock<std::mutex> syncTokenLock(syncTokenMutex);
    return std::move(syncToken);
}

我想知道是否有一些更优雅的方式,如简单地声明:

std::atomic<std::unique_ptr<SyncToken>> syncToken;

并避免互斥的需要。 或者可能我根本不需要关心这里的锁,而std :: move已经是原子了?

经过我迄今为止的研究,在我看来:

  • std :: move本身不是原子的,并且需要进行一些同步,否则2个线程同时调用我的方法可能会以2个未定义指针的副本结束。
  • std :: atomic声明为我编译,但我不知道如何初始化它,并且做出移动。

  • 不,这是不可能的。

    你传递给std::atomic的值T需要是可复制的,而std::unique_ptr不是。 像std::atomic::loadstd::atomic::store按值取T对象。

    std::atomic包装某些东西也不会使原子值为原子值。

    在原子上下文中使用std::unique_ptr时,必须考虑到在管理资源时可能会遇到问题。 你永远不知道有多少线程仍然引用你的数据,这个问题可以通过使用原子引用计数的std::shared_ptr来解决。 (你需要使用std::atomic_is_lock_free函数来检查它是否真的是原子。)

    我在寻找代码时遇到的一件事情就是borrowSyncToken函数的意图。 它被称为借用,但是您通过移出std::unique_ptr将令牌的所有权传递给调用者,拥有权如何传递回来以及当DataManager当前不拥有令牌时其他线程会得到什么?

    链接地址: http://www.djcxy.com/p/78211.html

    上一篇: c++

    下一篇: Are primitive data types in c# atomic (thread safe)?