2

軽量の spin_lock を実装するために、ユーザー モード スレッドで揮発性変数をスピンすることが安全かどうかはよくわかりません。tbb ソース コード tbb_machine.h:170 を調べました。

//! Spin WHILE the value of the variable is equal to a given value
/** T and U should be comparable types. */
template<typename T, typename U>
void spin_wait_while_eq( const volatile T& location, U value ) {
    atomic_backoff backoff;
    while( location==value ) backoff.pause();
}

そして、私が見ることができるように、atomic_backoff クラスにはフェンスがありません。他のユーザーモードの spin_lock 実装からのものですが、それらのほとんどは CAS (Compare and Swap) を使用します。

4

2 に答える 2

2

トリッキー。理論的には、このコードは安全ではないと思います。メモリバリアがない場合、保護しているデータアクセスはスピンロックを越えて移動できます。ただし、これは、コンパイラが非常に積極的にインライン展開し、この並べ替えの目的を認識できる場合にのみ行われます。

おそらく Intel は、このコードが現在のすべてのコンパイラで機能し、コンパイラが理論的にはこのコードを壊すような変換を実行できるとしても、それらの変換はプログラムを高速化しないため、コンパイラはおそらく実行しないと単純に判断したのでしょう。

もう 1 つの可能性は、このコードが、volatileアクセスの周囲にメモリ バリアを暗黙的に実装するコンパイラでのみ使用されることです。Microsoft の Visual C++ コンパイラ (2005 以降) はこれを行います。これがブロックなどにラップされているかどうかを確認し、メモリバリアを使用する#ifdefコンパイラにのみこの実装を適用していますか?volatile

于 2010-04-22T13:43:06.790 に答える
1

これはスピン待機であり、スピンロックではないことに注意してください。関連する書き込み操作はありません。何も取得されません。

ロック プロセスを完了するために書き込み操作を追加しようとすると、解決できない競合が発生します。

于 2010-04-22T13:51:27.087 に答える