1

C ++では、次のサンプル実装があります。

#include <thread>
#include <iostream>

void doSomeWork( void )
{
    std::cout << "hello from thread..." << std::endl;
    while(true)
    {
       printf("Getting inside doSomeWork\n");
       sleep(1);
    }
}

int main( int argc, char *argv[] )
{
    std::thread t( doSomeWork );
    t.join();

    processing();

    return 0;
}

void processing()
{
   while(true)
   {
      printf("Getting inside processing\n");
      sleep(1);
   }
}

doSomeWork()が処理を続行し、processing()をブロックするという問題があります。スレッドは非同期であると思ったので、スリープ中に他のことができます。ここでの私の質問は、doSomeWork()でスリープして他のスレッドを生成してから、doSomework()を再開するにはどうすればよいですか?

4

2 に答える 2

6

この線

t.join();

スレッドtが完了するまで(の場合doSomeWork())、呼び出し元のスレッドを一時停止します。

コードを次のように変更します

std::thread t( doSomeWork );
processing();
t.join();

必要に応じて、並行して実行しますprocessing()doSomeWork()

于 2013-02-22T15:22:36.607 に答える
2

t.join();に 置き換える t.detach();

ただし、detach「このスレッドには興味がないので、いつでも終了する可能性があります」や「何らかの同期メカニズムでスレッドを同期します」などの意味に注意してください。基本的に、外部(スレッドへの)同期メカニズムがある場合に使用されるため、joinを使用したくありません。join毎回使用するのが一般的ですがdetach、必要な場合にのみ使用してください。あなたの特定のケースでは、永久ループを備えた同期メカニズムがあるので、使用することは絶対に問題detachありませんが、それらの違いに注意してください。

于 2013-02-22T15:24:13.373 に答える