C和gcc中原子变量的相等性检验

| 我有一个关于使用gcc的原子变量的虚拟问题。 我的机器支持
__sync_add_and_fetch
功能;我在线程A中使用此调用来设置
my_variable (int) 
。 我希望线程B读取该共享变量以针对某个值进行测试,例如20 写以下内容是否正确
   if( __sync_bool_compare_and_swap( &my_variable, 20, 20 ) ){
          //..Ok! It is 20 so go ahead!
   }else{
          // wrong: it is not ok.
   }
如果gcc没错,则共享变量中出现竞赛时,race3可能会失败,但是我不知道返回的结果是什么。
__sync_bool_compare_and_swap
如何工作? 问题是,同时线程A使用
__sync_fetch_and_add
更改值时,还会发生什么情况?是否总是保证当
__sync_bool_compare_and_swap
同时运行时,它将返回该sum事件的值? 理想地说,就我的目的而言,我确实需要一个功能,该功能仅执行原子只读操作,也不执行交换操作。有C或gcc这样的东西吗? 非常感谢 美国空军     
已邀请:
就原子操作而言,它们是无中断完成的。如果您有多个原子操作希望同时运行,则它们的顺序将存在争用条件,但是每个操作都会运行到完成。例如,假设“ 5”是第一个,它将在“ 4”执行其比较和交换之前执行提取和加法操作。 您还可以考虑查看其他信号发送方法。您可能在一个线程中正在更新的值与另一个线程检查它的值是否为20之间存在争用条件。换句话说,它可能在另一个线程不知道的情况下在第20个传递时立即更新。 但是,如果所有这些都不是太重要,那么您可以不使用任何
__sync*
函数就可以完成所有这些操作,因为只有一个线程正在编写而另一个线程正在读取;无需担心数据损坏。同样,您不必担心变量是最新的,因为您有一个涉及该变量的单独竞争条件(值的更新速度快于其检查的速度)。     
免责声明:我没有使用过GCC _sync操作,但我想它们与MSVC中的相同。我确实认为应该可行。原子指令始终作为一个单元执行,以防止出现竞争状况。现在,这假定您关注的变量未映射到某些物理硬件。     

要回复问题请先登录注册