我正在尝试创建一个以非阻塞方式工作的线程,调用者可以选择是否等待线程。
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
from移动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
,因此在我看来,我们无法将这些函数分开。有什么解决方法吗?