任何人都知道gcc用表達式作爲原子內建值的值傳遞。考慮下面的功能。 gcc會保證這個操作的原子性嗎? (即使額外的週期都需要計算2 << nr
?gcc原子運算符中的表達式
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
__sync_fetch_and_or(addr, set ? 2 << nr : 0);
}
謝謝!
任何人都知道gcc用表達式作爲原子內建值的值傳遞。考慮下面的功能。 gcc會保證這個操作的原子性嗎? (即使額外的週期都需要計算2 << nr
?gcc原子運算符中的表達式
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
__sync_fetch_and_or(addr, set ? 2 << nr : 0);
}
謝謝!
的表達啓動__sync_fetch_and_or()
操作之前set ? 2 << nr : 0
必須進行評估。因此,讀取和或訪問addr
將原子 - 沒問題
只是要清楚 - addr
指向的內存的讀取/修改/寫入操作將以原子方式發生 - 要評估的or值將不是原子的(但它不會是原子的不需要)
你的功能將相當於該功能(他們甚至可能編譯到完全相同的代碼):
static inline test_and_set_bit(volatile void *addr, int nr, int set) {
const int bit = set ? 2 << nr : 0;
__sync_fetch_and_or(addr, bit);
}
表達不會evaulated「原子」,但由於它涉及到所有局部變量的不相關。 __sync_fetch_and_or
將以原子方式執行。你可能想改變你的功能看起來像這樣,以便後面的人不會感到困惑。
所以首先評估表達式,然後進行原子操作?這就是我認爲會發生的事情,但是確認一下是很好的。謝謝! – 2010-11-23 19:09:51