【发布时间】:2012-12-13 19:11:31
【问题描述】:
是否可以使用 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 声明为我编译,但我不知道如何初始化它并采取行动。
【问题讨论】:
标签: c++ c++11 thread-safety move-semantics unique-ptr