我的设置有点像这样:
void* work(void*) { while (true) {/*do work*/} return 0;}
class WorkDoer
{
private:
pthread_t id;
public:
WorkDoer() { pthread_create(&id, NULL, work, (void*)this); }
void Shutdown() { pthread_join(id, NULL); /*other cleanup*/ }
}
在某些情况下,从主线程调用Shutdown()
,以及其他一些我希望从线程内部调用shutdown的情况(紧接着从该线程返回)。
pthread_join()
的文档说如果调用线程与传递的线程相同,它将返回EDEADLK
。
我的问题是:这样做是否可以,如果是这样安全吗? (因此忽略了连接失败,因为我会在一瞬间很好地结束线程?)或者,它是否应该避免?
答案 0 :(得分:4)
您当然可以从正在运行的线程本身调用pthread_join()
,并且您已经发现调用本身将正确处理它,并为您提供错误代码。但是,有一些问题:
pthread_join()
时不会退出。pthread_join()
。换句话说,这种方法与程序中的错误一样可以接受。
作为一种解决方案,我建议您重新审视设计并确保在正确的时间和地点调用Shutdown()
。毕竟,名称“关闭”在这里没有多大意义,因为它不会关闭一个东西。它的作用仅仅是等待线程完成并在发生后清理其状态。
如果要结束工作线程,请从线程例程返回或调用pthread_exit()
。然后通过调用pthread_join()
确保启动线程的人清理了一切。
如果要强制线程停止,请考虑使用pthread_kill()
来表示线程,或者实现某种类型的消息传递,您可以使用它来“告诉”线程停止执行任何操作
答案 1 :(得分:1)
The pthread_join() function may fail if:
EDEADLK
A deadlock was detected or the value of thread specifies the
calling thread.
我会说使用风险自负。
答案 2 :(得分:1)
为什么不让线程调用pthread_detach(pthread_self());
然后退出。无需再调用pthread_join()
,并冒着失败的风险。