是否可以使用 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 声明为我编译,但我不知道如何初始化它并采取行动。