2011-04-12 44 views
2

我有一个关于使用gcc的原子变量的虚拟问题。 我的机器支持__sync_add_and_fetch功能;我在线程A中使用此调用来设置my_variable (int)C和gcc中的原子变量的平等测试

我希望线程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当有共享变量的竞争中__sync_val_compare_and_swap可能会失败,但我不知道它不会返回;它如何与__sync_bool_compare_and_swap一起工作?

问题是什么也发生,当同时线程A正在使用__sync_fetch_and_add更改值?总是保证它会在__sync_bool_compare_and_swap同时运行时返回总和事件的值?

理想情况下,为了达到我的目的,我真的需要一个函数,它只执行一个原子READ,而不是一个Swap。有C或GCC这样的东西?

非常感谢

AFG

+0

如果您认为此代码有任何用处,我怀疑您的代码中存在重大逻辑问题... – 2011-04-12 18:41:37

回答

0

声明:我没有用过_sync GCC的操作,但我会想象他们是相同MSVC的人。我相信这应该起作用。原子指令总是作为一个单元来执行,以防止竞争条件。现在,这假定您关心的变量未映射到某些物理硬件。

2

就原子操作而言,它们意味着无中断地完成。如果您希望同时运行多个原子操作,则会出现与它们的顺序有关的竞争条件,但每个操作都将运行完成。例如,假设__sync_fetch_and_add是第一个,它将在__sync_bool_compare_and_swap执行比较和交换之前执行提取和添加。

您也可以考虑查看其他信令方法。您可能在一个线程中更新的值与另一个线程检查它的准确值20之间存在争用条件。换句话说,它可以更新为正确的20,而其他线程永远不知道它。

但是,如果这些都不是太重要,你可以做所有这些没有任何__sync*函数,因为只有一个线程正在写入和另一个读取;无需担心数据损坏。也不需要担心变量是最新的,因为你有一个单独的竞争条件涉及到(值更新速度快于其检查)。