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()时,来电者根本没有被阻止。然后我尝试将joinfrom移动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 回答