【问题标题】:Postfix evaluation within atomic CAS原子 CAS 中的后缀评估
【发布时间】:2014-12-05 09:28:56
【问题描述】:

第一个问题,为什么 atomic_compare_exchange_weak 操作的参数中没有应用后缀评估 (++)? a 的值在操作之前和之后是相同的。但是,当在 printf() 中使用时,正如预期的那样,该值会增加。

代码:

int main(){
  atomic<int> s(0);
  int a = 0;
  atomic_compare_exchange_weak(&s,&a,a++);
  printf("%d %d\n",s.load(),a++);
  printf("%d\n",a);
}

有以下输出:

0 0 
1

当我期望这个输出时:

0 1
2

其次,我想使用后缀评估来测试多线程情况下原子操作的顺序,我的方法是否存在某种悲剧性的缺陷?例如,即使增量运算符确实有效,是否会在第一个 CAS 和增量计算之间发生另一个 CAS 操作?

【问题讨论】:

    标签: c++ multithreading atomic


    【解决方案1】:

    如果您将 a++ 作为第三个参数传递,则在函数调用开始时, a 会保留递增的值(请参阅 order of evaluation )。 由于该值不再等于原子的值,因此 C++ CAS 从原子读取并写入第二个参数,这使得增量看起来“没有发生”。

    检查 CAS 返回的值。

    【讨论】:

    • 那么,如果我想确保 a 的递增和 s 的 CAS 顺序发生,我需要使用锁吗?谢谢,原来的代码不正确。
    • @MattPennington atomic_compare_exchange_weak(&amp;s, &amp;a, a + 1); a++; 应该可以正常工作吗?
    • @Tavian,我希望 CAS 和增量不会被另一个线程中断...我没有包含多个线程以保持示例简洁。所以在这个例子中,是的,那是正确的,但我希望这两个操作“作为一个”发生。
    • @MattPennington 很难用一个简化的例子来说明你需要什么(这个 a 甚至没有共享)。锁将是一个简单的开始。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2012-03-10
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多