3

このコード スニペットは、 hereConcurrentQueueから提供された実装からのものです。

internal bool TryPeek(out T result) 
{
    result = default(T); 
    int lowLocal = Low;
    if (lowLocal > High)
        return false;
    SpinWait spin = new SpinWait(); 
    while (m_state[lowLocal] == 0)
    { 
        spin.SpinOnce(); 
    }
    result = m_array[lowLocal]; 
    return true;
}

回転するのではなく、本当にロックフリーですか?

4

3 に答える 3

6

スピニングはロックです。これは、MSDNウィキペディア、およびその他の多くのリソースに記載されています。言葉の問題ではない。ロックフリーは保証です。コードで lock ステートメントを使用してはならないという意味ではありません。システム全体の進行が保証されている場合、アルゴリズムはロックフリーです。このコードとロックを使用するコードに違いはありません。唯一の違いは、スピンがスレッドをスリープ モードにする代わりに、ビジー待機とスレッド イールドを使用することです。これがシステム全体のプロセスを保証する方法がわからないので、個人的にはこれはロックフリーの実装ではないと思います。少なくともこの機能ではありません。

于 2013-03-01T19:36:53.813 に答える
3

ロックフリーとは、ロックを使用しないことを意味します。スピン待機はロックされていません。ロックを使用せずにデータへのアクセスを同期する方法は多数あります。スピン待機の実行は、(多くの) オプションの 1 つです。すべてのロックフリー コードがスピン待機を使用するわけではありません。

于 2013-03-01T18:27:18.117 に答える
3

スピンは、CPU をタイトなループに配置し、現在のプロセッサ時間の残りの部分を解放せずに、ユーザー提供のループによって発生する可能性のある問題を回避します。これは、状態の変化が差し迫っていることがわかっている場合に役立ちます。これが通常のコードに最適なオプションであることはまれであり、この特殊な状況ではロックの代替手段となります。

そうです、ロックという用語が .NET Framework で使用されているため、コードはロックフリーです。

http://msdn.microsoft.com/en-us/library/hh228603.aspx

于 2013-03-01T18:32:12.933 に答える