2

pthreads を使用して自分の目的に合ったカスタマイズされたスレッドプールを作成しようとしていますが、pthreads は初めてです。私はこれらの ( POSIX スレッド プログラミングおよびLinux チュートリアル Posix スレッド) チュートリアルをオンラインで読みましたが、非常に役に立ちましたが、mutex と条件変数に関して (おそらくばかげた) 疑問がいくつかあります。

  1. ミューテックスのスコープは何ですか? 一度に 1 つのスレッドだけがアクセスできるように、グローバルミューテックスはすべてのグローバル変数をロックしますか? 2 つのグローバル ミューテックスがある場合、それらは同じ変数セットをロックしますか? クラスまたは関数内で宣言されたミューテックスはどうなりますか? ロック/ロック解除するとどうなりますか?
  2. グローバル変数を読み取るだけで、まったく変更しない場合でも、mutex ロックを使用する必要がありますか?
  3. 私が正しければ、条件変数を使用してpthread_cond_wait()、何らかの条件でスリープしている (または を使用してブロックされている) 他のスレッドをウェイクアップします。スリープ状態のスレッドへのウェイクアップ コールは、他のスレッドによって、pthread_cond_signal()またはpthread_cond_broadcast()他のスレッドから与えられます。すべてまたは 1 つのスレッドがウェイクアップして作業を行い、次の作業が利用可能になるまで待機するように、制御の流れはどのように発生するはずですか? 4 つのスレッドを使用するシナリオに特に関心があります。
  4. スレッドを作成する前に、スレッドのアフィニティを特定のプロセッサ コアに設定する方法はありますか (目的のコアで実行を開始し、作成後にコアの移動が発生しないようにするため)。

質問がばかげているように見える場合は申し訳ありませんが、私が言ったように、私はこれに慣れていません。ヘルプ、コメント、コード、または適切なリソースへのポインターを歓迎します。よろしくお願いします。

4

1 に答える 1

1

それはたくさんの質問です。いくつかの答え。

(1a) ミューテックスのスコープは、あなたがプログラムするものです。その意味では、他の種類の変数と何ら変わりはありません。

(1b) グローバルミューテックスは、保護するようにプログラムした変数を保護します。他の質問からすると、ここで根本的な誤解をしている可能性があると思います。ミューテックスについて魔法は何もありません。宣言して「OK、これらの変数を保護してください」と言うだけではなく、コードにミューテックスを組み込む必要があります。したがって、変数 X を使用する 2 つの関数があり、1 つが変数への変更の周りでミューテックスのロック/ロック解除を行い、もう 1 つの関数がミューテックスが存在することさえ完全に無視する場合、実際には何も保護していません。私が考えることができる最良の例は、アドバイザリ ファイル ロックです。あるプログラムはそれらを使用できますが、別のプログラムが使用しない場合、そのファイルはロックされません。

(1c) 原則として、複数のミューテックスで同じデータをロックしないでください。問題への誘いです。ここでもミューテックスの使用は、プログラムされた連携に依存します。関数 A がミューテックス C でデータ B を保護し、関数 D がミューテックス E でデータ B を保護している場合、データ B はまったく保護されません。関数 A はミューテックス C のロックを保持できますが、関数 D はそれに注意を払わないため、とにかくデータ B を上書きするだけです。

(1d) 基本的なスコープ規則が適用されます。

(2) いいえ。変数がスレッド間で矛盾するような方法で変更されない場合は、変数をロックする必要はありません。

(3) SO については、これについてかなり詳しく説明している詳細な回答が多数あります。ちょっと辺りを探す。

(4) 私が知っているわけではありません。

于 2012-06-13T16:53:01.660 に答える