作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以使用 C++11 原子操作安全地 move 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::atomic
的值 T
需要可平凡复制,而 std::unique_ptr
则不是。 std::atomic::load
或 std::atomic::store
等操作按值获取 T 对象。
在 std::atomic
中打包一些东西也不会从值原子中进行操作。
在原子上下文中使用 std::unique_ptr
时,您必须考虑这样一个事实,即在管理资源时可能会遇到问题。您永远不知道有多少线程仍在引用您的数据,这个问题可以通过使用原子引用计数的 std::shared_ptr
来解决。 (您需要使用 std::atomic_is_lock_free
函数检查它是否真的是原子的。)
在查看您的代码时,我也偶然发现了 borrowSyncToken
函数的意图。它被称为借用,但您通过移出 std::unique_ptr
将 token 的所有权传递给调用者,所有权如何传回以及当 DataManager 当前不拥有 token ?
关于c++ - 线程安全的 unique_ptr move ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866743/
我是一名优秀的程序员,十分优秀!