MCS ロックの説明で、アトミックな「フェッチおよびストア」命令に出くわしました。
私が収集したものから、これはアトミックに値をメモリ位置に書き込み、そのメモリ位置の元の値を返しますが、それは正しいですか?
そして、gcc のアトミック ビルトインです。
__sync_lock_test_and_set
アトミックなフェッチとストアと同じですか?
MCS ロックの説明で、アトミックな「フェッチおよびストア」命令に出くわしました。
私が収集したものから、これはアトミックに値をメモリ位置に書き込み、そのメモリ位置の元の値を返しますが、それは正しいですか?
そして、gcc のアトミック ビルトインです。
__sync_lock_test_and_set
アトミックなフェッチとストアと同じですか?
GCC info pageによると、これは確かにアトミックですが、基本的なアトミックなフェッチとストアではありません。
(これは 4.4 のマニュアルから切り取ったものなので、セクション番号が異なります)
5.48 アトミックメモリアクセス用の組み込み関数
(...)
TYPE __sync_fetch_and_add (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_sub (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_or (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_and (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_xor (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_nand (TYPE *ptr, TYPE value, ...) TYPE __sync_add_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_sub_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_or_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_and_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_xor_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_nand_and_fetch (TYPE *ptr, TYPE value, ...) bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) TYPE __sync_val_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) __sync_synchronize (...) TYPE __sync_lock_test_and_set (TYPE *ptr, TYPE value, ...) void __sync_lock_release (TYPE *ptr, ...)
これらは明らかに Intel Itanium リファレンス マニュアルから取られたものですが、GCC はそれらが可能な任意の CPU に実装されています (そうでない CPU で使用すると警告が表示され、非アトミック バージョンが使用されます)。あなたが指摘した関数は、実際には拡張メモリ バリア (またはクリティカル エリア) です。バリアは によって確立され__sync_lock_test_and_set
、 によって解放され__sync_lock_release
ます。
基本的なアトミック fetch-and-set を探している場合は、おそらく__sync_val_compare_and_swap
、ほとんどの場合、より具体的なバージョンのいずれかを使用する必要があります。