0

グローバル変数flag、関数this()、および関数がありますthat()。現在、、、main()およびthis()すべてthat()の人は、読み取りおよび/または書き込みが必要な場合がありますflag。ミューテックスを適切に使用するには、次のことが必要です。

  1. a を宣言しpthread_mutex_tて初期化します。
  2. this()およびそれらのスレッドを作成しますthat()。終了する前に終了するのを待ちpthread_join()たいからです。main()this()that()
  3. コードのどこでも、main()this()、またはthat()flag読み取りまたは書き込みが行われている場所で、呼び出してpthread_mutex_lock()から [read/write]flagを呼び出してから呼び出しますpthread_mutex_unlock()

あれは正しいですか?

これを行う予定はありませんが、次のようflagに無限ループをチェックインしたい場合main():

    while(flag != value)
        continue;

あなたlock()とミューテックス、および他のスレッドは、常にそのようにいたるところunlock()にアクセスする機会を得ますflagか?main()

4

1 に答える 1

1

1-2--3-正解です。

さて、あなたがそのループを書くなら、

  • 3の結果として、メインスレッドはロックを保持し、他のスレッドはロックを取得できないため、事実上、無限ループを作成しました。
  • ロックしないと、動作しない可能性があります。CPUアーキテクチャによって異なります(まず、flagアトミックに更新可能である必要があり、他のコアはこれらの変更を確認する必要があります。すべてのアーキテクチャがこれを保証するわけではありません)。それが機能したとしても、それはまだビジー待機ループであり、使用すべきではありません。

ベンが彼のコメントで指摘したように、シグナリングに条件変数を使用したい(注:Pthreadと待機条件

ミューテックスをどこでlock()およびunlock()しますか

経験則として、競合を最小限に抑えるために、ロックをできるだけ短くします。これは、ロック+読み取り+ロック解除のように単純な場合もありますが、次の一連の操作がフラグを変更してはならないという事実に依存している場合は、必要な限りロックを保持します。

于 2013-03-20T22:42:43.313 に答える