2010-11-23 10 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); 
} 

を計算するために必要とされていても__sync_fetch_and_or()運転が開始される前に(感謝!

答えて

2

表現set ? 2 << nr : 0だからフェッチ-AND-OR addrへのアクセスがアトミックになります。評価しなければなりません - 問題なし

addrが指すメモリに対する読み取り/変更/書き込みアクションは原子的に起こります - or'edされる値の評価はアトミックではありませんになる必要がある)。

+0

最初に式が評価され、次に原子操作ですか?それは私が起こると思ったことですが、何らかの確認をすることは良いことです。ありがとう! –

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はアトミックに実行されます。あなたは、あなたの後に来る人々が混乱しないように、このように見えるように機能を変更することができます。