2010-11-23 33 views
1

任何人都知道gcc用表達式作爲原子內建值的值傳遞。考慮下面的功能。 gcc會保證這個操作的原子性嗎? (即使額外的週期都需要計算2 << nrgcc原子運算符中的表達式

static inline test_and_set_bit(volatile void *addr, int nr, int set) { 
    __sync_fetch_and_or(addr, set ? 2 << nr : 0); 
} 

謝謝!

回答

2

的表達啓動__sync_fetch_and_or()操作之前set ? 2 << nr : 0必須進行評估。因此,讀取和或訪問addr將原子 - 沒問題

只是要清楚 - addr指向的內存的讀取/修改/寫入操作將以原子方式發生 - 要評估的or值將不是原子的(但它不會是原子的不需要)

+0

所以首先評估表達式,然後進行原子操作?這就是我認爲會發生的事情,但是確認一下是很好的。謝謝! – 2010-11-23 19:09:51

1

你的功能將相當於該功能(他們甚至可能編譯到完全相同的代碼):

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將以原子方式執行。你可能想改變你的功能看起來像這樣,以便後面的人不會感到困惑。