2013-07-04 58 views
1

我有像下面用原子取代條件嗎?

pthread_spin_lock(&slock); 
    if (round_robin_next_ == hp_count() - 1) { 
     round_robin_next_ = 0; 
    } else { 
     round_robin_next_++; 
    } 
    pthread_spin_unlock(&slock); 

我使用自旋鎖爲了使上述線程安全的,並確保每個線程比前一個round_robin_next_的下一個值在我的代碼的條件。你可以看到round_robin_next_是圓形的,達到一定的數值​​並回到0.

我的問題是上面通過使用gcc intrinsics以某種方式自由鎖定了嗎?或一些平臺特定的指示?我在使用gcc 4.7的64位Linux上,如果無法移植,我無所謂與特定於平臺的解決方案無關。

+0

這是完全一般的,還是單一消費者或單一生產者,或兩者兼而有之? (SPSC的特定緩衝區肯定可以無鎖地完成。) –

+0

@KerrekSB不確定你的意思。它的一個函數被許多線程調用以獲得下一個值round_robin_next_(這是一個共享變量) – user1461001

+0

我可能誤解了你想要做的事情。你*只*想讀取和推進一個櫃檯,這就是全部? –

回答

1

從某種意義上說,是的,你可以在不鎖定的情況下編寫上面的代碼;然而,我當然同意其他人的看法,那就是「爲什麼要取消鎖定?」這個問題。優化去除鎖定可能會提供更好的性能,但是將代碼專門化到當前的要求是值得你花時間和精力的。有了這個說法,__sync_bool_compare_and_swap就足以實現幾乎所有的同步算法。例如:

do { 
    old = round_robin_next_; 
    if (old == hp_count() - 1) { new = 0; } 
    else { new = old + 1; } 
} while (!__sync_bool_compare_and_swap(&round_robin_next_, old, new)); 

內在原子評估存儲位置是否仍包含舊的,如果是這樣,那麼它存儲新到該位置。如果該位置不包含舊的,則返回false並再次嘗試更新。

0

答案是肯定的,因爲pthread基元建立在這些體系結構基元之上。

所以這個問題成爲你想要實現的目標?