我正在尝试创建一个以非阻塞方式工作的线程,并且调用者可以选择是否等待线程。
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
之后,所以在我看来,我们无法将这些函数分开。有没有解决方法?
答案 0 :(得分:2)
在您调用pthread_join
函数之前,新创建的线程可能正在返回。因此,它根本不会阻塞,但它可以正常工作。