2011-04-12 36 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*函數,因爲只有一個線程正在寫入和另一個讀取;無需擔心數據損壞。也不需要擔心變量是最新的,因爲你有一個單獨的競爭條件涉及到(值更新速度快於其檢查)。