【问题标题】:Is make_pair atomic?make_pair 是原子的吗?
【发布时间】:2016-05-03 00:04:16
【问题描述】:
std::pair<Object, OtherObject*> currentData;

void OnCallback()
{
    Object object = getObject();
    OtherObject* otherObject = new OtherObject();
    currentData = std::make_pair(object, otherObject);
}

make_pair 是原子的吗? make_pair 是否会将字段从其返回值复制或移动到 currentData?如果我有另一个线程访问currentData 的值,那么currentData 的值在访问时是否有可能不完整?

很遗憾,我在make_pair 的标准文档中没有看到任何相关信息。

【问题讨论】:

  • 你能解释一下“原子”是什么意思吗?因为它显然不是std::atomic 意义上的原子。
  • std::make_pair 使用移动语义,但这并不意味着它是符合std::atomic 的原子
  • 如果不是std::atomic 的意思,那么你的意思是什么意思。因为你引用的感觉似乎是 std::atomic 所做的。
  • @LokiAstari 我认为我的整个问题归结为赋值运算符的原子性。这对我有帮助:stackoverflow.com/questions/8919818/… 我什至都懒得看std::atomic 课程,但看起来这就是我想要的。这也帮助了我:stackoverflow.com/questions/16320838/…

标签: c++ thread-safety atomic


【解决方案1】:

make_pair() 是否是原子的无关紧要。

如果我有另一个线程访问 currentData 的值,是否存在 currentData 的值可能不完整 访问了吗?

这里唯一的问题是std::pair 的赋值运算符是否是原子的,因为这决定了赋值操作是否是线程安全的。赋值之前发生的事情,以及被赋值的值是如何产生的,与赋值操作的原子性完全无关。

这个赋值操作不是原子的,也不是线程安全的。

【讨论】:

  • 创建和分配分离是个好点,谢谢。
猜你喜欢
  • 2011-03-03
  • 2010-12-11
  • 2020-05-07
  • 2013-01-26
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多