5


1

単一の浮動小数点の割り当ては、iPhoneのアトミック操作ですか?

iPhoneのような32ビットデバイスでは、短いフロートを割り当てることは、アトミックでスレッドセーフな操作だと思います。 確認したいです。 Objective-Cスレッドから呼び出したいC関数があり、呼び出す前にロックを取得したくない:

void setFloatValue(float value) {
    globalFloat = value;
}

3 回答


5


32ビットARMでは、上記の関数は次のようにコンパイルされます。

ldr r2, [pc, #0x??]  ; to retrieve the address of globalFloat
str r0, [r2]         ; store value into globalFloat

2つの命令があり、CPUはそれらの間で何でも自由に実行できますが、メモリに影響を与えるのは2番目の命令 `str r0、[r2]`だけです。 「globalFloat」が調整されていない限り、CPUは単一コピーのアトミック書き込みを実行できます。

グローバルポインターがアライメントされていない場合、割り当ては非アトミックになります。 また、より大きな構造に書き込む場合、非アトミックです。 CGRect。

アトミックであることは、スレッドの安全性にとって十分ではありません。 キャッシュと命令の並べ替えにより、変更が他のCPUコアに表示されない場合があります。 変更を「公開」するには、 `OSMemoryBarrier()`を挿入する必要がある場合があります。

アトミック操作は通常、複合操作を伴う場合に興味深いものです(例: globalFloat + = value)。 組み込みのhttp://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/atomic.3.html [OSAtomic]ライブラリをチェックしてみてください。


3


はい、それはアトミックです。 32ビットアーキテクチャでは、32ビット以下のプリミティブデータ型(char、short、int、long、floatなど)に対するストア操作はアトミックになります。


0


あなたの質問には、単なる原子性以上のものがあります。 書き込みがアトミックであっても、別のスレッドが何らかの種類のメモリバリアなしで変更を認識するという保証はありません。 これはおそらく、CPUが1つしかないため、現在のiPhoneでは問題になりませんが、デスクトップマシンでは問題になる可能性があります。

See: