2

非ブロッキング方式で機能するスレッドを作成しようとしていますが、呼び出し元には、スレッドを待機するかどうかのオプションがあります。

class A {
public:
  void run();
  void wait();
  pthread_t worker;
};

run()関数はスレッドを作成し、すぐに戻ります。ユーザーが待つ必要がある場合は、 を呼び出すことができますwait()。定義は次のようになります

void A::Run () {
  //create worker thread
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread.");
  pthread_attr_destroy(&attr);
}

void A::WaitUntilDone () {
  FATALIF(pthread_join (worker, NULL), "joining threads failed.");
}

ただし、を呼び出すとWaitUntilDone()、発信者はまったくブロックされません。次に、joinからWaitUntilDone()に移動しようとしましたがRun()、動作します:

void A::Run () {
  //create worker thread
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread.");
  FATALIF(pthread_join (worker, NULL), "joining threads failed.");
  pthread_attr_destroy(&attr);
}

void A::WaitUntilDone () {
  // do not wait here
  // FATALIF(pthread_join (worker, NULL), "joining threads failed.");
}

pthread_join私が見つけたすべての例で、pthread_join呼び出しは の直後に来るpthread_createので、これらの関数を分離することはできないように私には思えます。回避策はありますか?

4

1 に答える 1

2

新しく作成されたスレッドは、関数を呼び出す前に返されている可能性がありpthread_joinます。したがって、まったくブロックされませんが、正常に動作します。

于 2013-05-16T08:46:44.473 に答える