2

スレッドプールを作成したいのですが。ServerThread.cppというクラスがあり、そのコンストラクターは次のようなことを行う必要があります。

ServerThread::ServerThread()
   {
         for( int i=0 ; i<init_thr_num ; i++ )
         {
              //create a pool of threads
              //suspend them, they will wake up when requests arrive for them to process
         }
   }

コンストラクター内にpthreadを作成すると、実行を回避する必要のある未定義の動作が発生する可能性があるのではないかと考えていました。

ありがとう

4

2 に答える 2

5

あなたは確かにコンストラクターでそれを行うことができますが、ScottMeyersが彼のEffective/ More EffectiveC++の本で明確に説明している問題に注意する必要があります。

要するに、彼のポイントは、コンストラクター内で何らかの例外が発生した場合、ハーフバックされたオブジェクトは破棄されないということです。これにより、メモリリークが発生します。したがって、Meyersの提案は、「軽い」コンストラクターを用意しinit、オブジェクトが完全に作成された後に呼び出されるメソッドで「重い」作業を行うことです。

この引数は、コンストラクター内でのpthreadのプールの作成に厳密には関連していません(これにより、単純に作成してすぐに一時停止しても例外は発生しないと主張する場合があります)が、コンストラクターで何をするかについての一般的な考慮事項です。 (読む:グッドプラクティス)。

実行する必要のあるもう1つの考慮事項は、コンストラクターには戻り値がないことです。(例外がスローされない場合)スレッドの作成が失敗した場合でもオブジェクトを一貫性のある状態のままにしておくことができるのは事実ですが、種類initまたはstartメソッドからの戻り値を管理する方がよい場合があります。

また、このトピックに関するSOのこのスレッド、およびこのスレッドを読むこともできます。

于 2012-06-29T08:54:02.450 に答える
2

厳密に形式的な観点からは、コンストラクターは実際には他の関数と同じように関数であり、問​​題はないはずです。実際には、問題が発生する可能性があります。コンストラクターが終了する前に、スレッドが実際に実行を開始する場合があります。スレッドが動作するために完全に構​​築される必要がある場合、ServerThread問題が発生します。これはServerThread、が基本クラスであり、スレッドが派生クラスと対話する必要がある場合によくあります。(これは、見つけるのが非常に難しい問題です。最も頻繁に使用されるスレッドスケジューリングアルゴリズムでは、通常、新しいスレッドはすぐには実行を開始しないためです。)

于 2012-06-29T10:29:32.877 に答える