非ブロッキング方式で機能するスレッドを作成しようとしていますが、呼び出し元には、スレッドを待機するかどうかのオプションがあります。
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
ので、これらの関数を分離することはできないように私には思えます。回避策はありますか?