2012-03-02 5 views
7

私は30秒ごとに1回発砲する方法を持っています。私はスレッドで持っている必要があります。ブーストスレッドをデタッチまたは参加させるタイミングは?

私はクラス外から呼び出すことができるメソッドを持っています。 callThreadedMethod()のように、最終的なthreadedMethodを呼び出すスレッドを作成します。

これらは、だから私はmThreadにメソッドが呼び出されるたびに取り外ししなければならないのはMyClass

void callThreadedMethod(){ 
    mThread = boost::shared_ptr<boost::thread>(new boost::thread(&MyClass::threadedMethod, this)); 
} 

void threadedMethod(){ 
    //more code NOT inside a while loop 
} 

の方法がありますか?

MyClassデストラクタでjoin()を呼び出すだけで十分ですか?

threadedMethodが終了したときにスレッド自体が破壊されますか?

答えて

13

これは達成したいことによって異なります。あなたがいつでも気にしない場合、またはthreadedMethodへの呼び出しが終了するかどうか、またはスローされたかどうかは、作成した時点でただちにdetachになります。メソッドが完了すると、各スレッドは破棄されます。また、スレッドをメンバ変数に格納しないでください。

気をつけているのであれば、作成するスレッドごとにjoinを呼び出す必要があります(スレッドごとに1回、デストラクタでは1回ではありません)。私はあなたがそうは思わない。

本当に呼び出しごとに新しいスレッドを作成する必要がありますか?スレッドの作成にはコストがかかる可能性があるため、スレッドプールを使用して各スレッドにthreadedMethodを呼び出すこともできます。そのプールはMyClass instanceの寿命を持つことができます。しかしおそらく、それは30秒に1回しか起こらない何かのための過度のものです。