【问题标题】:How can I extract the pointer T from std::atomic<T>?如何从 std::atomic<T> 中提取指针 T?
【发布时间】:2020-07-15 04:24:11
【问题描述】:

我有一个简单的课程:

class List {
    List *next;
    int value;
};

还有一个std::atomic&lt;List *&gt; Ltag。如何从Ltag 中提取实际的List *? 我尝试了Ltag-&gt;value = 80,但没有成功。投射效果不佳。

【问题讨论】:

  • Ltag.load()-&gt;value = 80;
  • 所以你有一个指向非原子数据的原子指针。您不需要提取它,只需加载它。 atomic&lt;T*&gt; 不会超载 operator-&gt; 大概是为了让您不要忘记存储不会是原子操作。
  • this Q/A 对您有帮助吗?另外,要记住的重要一点是,对于像std::atomic&lt;List*&gt; 这样的东西,只有指针地址不受竞争条件的影响,而不是指向的对象。如果多个线程读取/写入/从指向的对象读取/写入,您将拥有 UB。
  • 旁注:不要对atomic 过于自信。更多情况下,您不想保护整个交易,而不仅仅是其中的一部分。
  • @alterigel: Is it safe to use the Structure dereference(->) operator on the result of std::atomic::load 更接近重复,它是关于在atomic&lt;T*&gt; 上使用.load()-&gt;member,而不是关于atomic&lt;node&gt;

标签: c++ stdatomic


【解决方案1】:

您可以利用std::atomic 的转换运算符。

(*Ltag).value = 80;

或使用load() 显式获取值。

Ltag.load()->value = 80;

PS:您正在使用带有指针的std::atomic,这意味着指向的对象可能存在数据竞争。

【讨论】:

猜你喜欢
  • 2018-11-22
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多