静的関数を持つクラスがあるとしましょう。クラスのコンストラクターは、静的関数をエントリポイントとして使用してpthread_createを実行します。
私の質問は:
このクラスのインスタンスが複数ある場合、それらはすべてその関数を使用して独自のスレッドを実行しますか?これを行うことに問題はありますか?そして...関数自体に静的変数が含まれている場合、再入可能ではないという問題がありますか?
静的関数を持つクラスがあるとしましょう。クラスのコンストラクターは、静的関数をエントリポイントとして使用してpthread_createを実行します。
私の質問は:
このクラスのインスタンスが複数ある場合、それらはすべてその関数を使用して独自のスレッドを実行しますか?これを行うことに問題はありますか?そして...関数自体に静的変数が含まれている場合、再入可能ではないという問題がありますか?
コンストラクターがpthread_create()
毎回実行する場合は、オブジェクトと同じ数のスレッドがあります。これらのスレッドstatic
がクラス内の変数にアクセスする場合は、それらの変数へのアクセスがミューテックスによって保護されていることを確認する必要があります。(また、これらのスレッドが非変数にアクセスする場合は、他の呼び出し元からオブジェクトのメソッドまで、それらstatic
も保護する必要があります)。
オブジェクトごとに1つのスレッドが多すぎる可能性があるため、設計を再検討することをお勧めします。
はい、すべてのクラスが同じ関数で新しいスレッドを開始します。非メンバー関数を使用する場合と同じように。
関数静的変数に関しては、それが問題です。C ++は実際には並行性について何も定義していないため、おそらく競合状態を見ていることになります。それらの関数静的変数の構築においてさえ。C ++ 0xのサポートが利用可能になるまでは、CPUのコンパイラ固有のスレッド機能を探す必要があります。これにより、これらの関数静的変数を「スレッドローカル」にするように指示できます。このようにして、各スレッドはそれらの独自のコピーを取得します。