线程安全unique_ptr移动
Thread safe unique_ptr move
是否可以使用 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::load
或std::atomic::store
等操作按值获取 T 对象。
在std::atomic
中打包某些东西也不会从值原子进行操作。
在原子上下文中使用std::unique_ptr
时,您必须考虑在管理资源时可能会遇到问题的事实。你永远不知道有多少线程仍然引用你的数据,这个问题可以通过使用原子引用计数的std::shared_ptr
来解决。(您需要使用 std::atomic_is_lock_free
函数检查它是否真的是原子的。
在查看您的代码时,我也偶然发现的一件事是borrowSyncToken
函数的意图。这称为借用,但您可以通过移出std::unique_ptr
将令牌的所有权传递给调用方,所有权如何传回,当 DataManager 当前不拥有令牌时,其他线程会得到什么?
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 唯一 ptr 将所有权移动到包含对象的方法
- 独特的PTR和移动语义