18

boost::thread演算子を使用してオブジェクトを作成し、newこのスレッドが作業を完了するのを待たずに続行します。

void do_work()
{
    // perform some i/o work
}

boost::thread *thread = new boost::thread(&do_work);

thread作業が完了したら削除する必要があると思います。スレッドの終了を明示的に待たずにこれを行う最善の方法は何ですか?

4

4 に答える 4

21

オブジェクトのboost::thread有効期間とネイティブ スレッドの有効期間は無関係です。オブジェクトはboost::threadいつでも範囲外になる可能性があります。

boost::threadクラスのドキュメントから

ファイルの存続期間が、ファイルを表す iostream オブジェクトの存続期間と異なる場合があるのと同様に、実行スレッドの存続期間は、実行スレッドを表すスレッド オブジェクトとは異なる場合があります。特に、join() の呼び出し後、スレッド オブジェクトは通常の存続期間が終了するまで存在し続けますが、実行スレッドは存在しなくなります。逆も可能です。join() が最初に呼び出されずにスレッド オブジェクトが破棄された場合、実行スレッドはその最初の関数が完了するまで続行されます。

編集: スレッドを開始する必要があり、呼び出す必要がない場合joinは、スレッドのコンストラクターを関数として使用できます。

    // Launch thread.
boost::thread(&do_work); 

ただし、スレッドが完了する前に完了すると確信している場合でも、それを行うことはお勧めしませんmain()

于 2010-10-19T17:19:30.097 に答える
13

使用できます

boost::thread t(&do_work);
t.detach();

boost::threadスレッドが切り離されると、オブジェクトによって所有されなくなります。オブジェクトは破棄でき、スレッドは引き続き実行されます。boost::threadデストラクタは、オブジェクトが実行中のスレッドを所有している場合にも呼び出すためdetach()tget destroy を許可しても同じ結果になります。

于 2010-10-19T17:20:09.847 に答える
3

boost :: shared_ptrを使用することをお勧めします。これにより、スレッドオブジェクトをいつ削除するかを気にする必要がなくなります。

boost::shared_ptr<boost::thread&gt; thread(new boost::thread(&do_work));
于 2010-10-20T03:10:34.260 に答える
0

スレッドの中断を確認する必要があります。

この記事もいいですね。

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/thread_management.html

于 2010-10-19T17:28:31.140 に答える