从另一个函数加入一个线程

时间:2013-03-03 16:06:54

标签: c++ pthreads

我正在尝试创建一个以非阻塞方式工作的线程,并且调用者可以选择是否等待线程。

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()时,呼叫者根本没有被阻止。然后我尝试将joinWaitUntilDone()移到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之后,所以在我看来,我们无法将这些函数分开。有没有解决方法?

1 个答案:

答案 0 :(得分:2)

在您调用pthread_join函数之前,新创建的线程可能正在返回。因此,它根本不会阻塞,但它可以正常工作。