0

過去 2 週間ほどスレッドを扱ってきましたが、スレッドについて質問したいと思います。

ミューテックスについては知っていますが、単一のミューテックスを扱ったことはありません。なんで?ここのような非常に単純なブールスイッチを使用しているため(C++、スレッドの例):

bool fakeMutex = false;
...
while (fakeMutex);
fakeMutex = true;
// do smth
fakeMutex = false;

私はこれについて考えてきましたが、それが失敗する可能性は非常に小さい(まだ可能性のある可能性があると信じています)と信じ始めました。

アセンブリでは、これらは理論的には次のようになります。

Compare:
    CMP 0,[offset fakeMutex]
    JG Compare
    MOV [offset fakeMutex],1
    ; do smth
    MOV [offset fakeMutex],0

このミューテックスが失敗する唯一の方法は、fakeMutex が false のときに CMP 0,[offset fakeMutex] が実行され、その直後に別のスレッドが引き継ぎ、MOV [offset fakeMutex],1 の後に進み、OLD スレッドがアセンブリを実行しているジョブに戻る場合です。そのはずではありません。

それは非常に可能性が高いですか?

boost::thread で定義されている通常のミューテックス ロックの利点は何ですか? アセンブリを分割できないことをどのように保証しますか? 上記の例のように、ブール値の「ミューテックス」と同じくらい速く動作しますか?

4

2 に答える 2

1

それは非常に可能性が高いですか?

はい。可能性はプログラムや実行環境などに依存するため、私は少しばかげています。ただし、コードを正しくしたい場合は、ミューテックスを使用する必要があります。

boost::thread で定義されている通常のミューテックス ロックの利点は何ですか?

主な利点を特定しました。それはアトミックでスレッドセーフです。したがって、コードを正しくします。プログラムに決定論的に結果を出力させたい場合 (IE の信頼性を高めるため)、ある種のスレッドセーフなイディオムを使用する必要があります。

アセンブリを分割できないことをどのように保証しますか?

一般に、実装はプラットフォームおよびハードウェア固有です。ミューテックスを実装する 1 つの方法は、特別なアセンブリ命令「Compare And Swap」を使用することです。

上記の例のように、ブール値の「ミューテックス」と同じくらい速く動作しますか?

同期にはコストがかかる可能性が非常に高くなります。マルチスレッド プログラムから優れたパフォーマンスを得るには、最後の手段として空きデータ構造をロックするために、厳密に必要な場合にのみ状態を同期します。ここに便利なガイドがあります。

于 2012-12-10T18:47:16.117 に答える
0

そんなことしたらダメ。変数がチェックされてからコンテキストスイッチが発生すると、このような状況に陥る可能性が非常に高くなります。常にアトミック操作を使用してください。さまざまな方法で実行できますが、すべてプラットフォームと OS に依存します。これは、OS によって割り込みが無効にされているか、何らかのアトミック操作が使用されている場合に実行できます (Intel の場合、前述のように、CMPXCHG または LOCK プレフィックスを使用します)。

于 2012-12-10T23:06:25.413 に答える