1

MCS ロックの説明で、アトミックな「フェッチおよびストア」命令に出くわしました。

私が収集したものから、これはアトミックに値をメモリ位置に書き込み、そのメモリ位置の元の値を返しますが、それは正しいですか?

そして、gcc のアトミック ビルトインです。

   __sync_lock_test_and_set

アトミックなフェッチとストアと同じですか?

4

1 に答える 1

1

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、ほとんどの場合、より具体的なバージョンのいずれかを使用する必要があります。

于 2011-04-04T04:21:34.880 に答える