我有一个类似这样的设置:
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()
是从主线程调用的,而在其他一些情况下,我想从线程本身内部调用关闭(之后立即从该线程返回)。
pthread_join()
的文档说,如果调用线程与传递的线程相同,它将返回一个 EDEADLK
。
我的问题是:这样做可以吗?如果可以,是否安全? (因此忽略连接失败,因为我很快就会很好地结束线程?)或者,这是应该避免的事情吗?
最佳答案
您当然可以从正在运行的线程本身调用 pthread_join()
,正如您所发现的那样,调用本身会正确处理它并给出一个错误代码。但是,存在一些问题:
- 这没有任何意义,因为连接不会连接任何东西。它只会告诉您您做错了什么。
- 线程本身不会在调用
pthread_join()
时退出。 - 即使线程存在,它的状态也不会被正确清理。其他一些线程(即您的应用程序的主线程)应该调用
pthread_join()
,除非该线程被创建为“分离的”。
换句话说,这种方法与程序中的错误一样可以接受。
作为解决方案,我建议重新审视设计并确保从正确的位置和正确的时间调用 Shutdown()
。毕竟,“shutdown”这个名字在这里没有多大意义,因为它不会关闭任何东西。它所做的只是等待线程完成并在完成后清理其状态。
当你想结束工作线程时,要么从线程例程返回,要么调用pthread_exit()
。 .然后确保启动线程的人通过调用 pthread_join()
来清理事情。
如果你想强制线程停止,考虑使用pthread_kill()
向线程发出信号,或者实现某种消息传递,您可以使用它来“告诉”线程停止做它正在做的任何事情。
关于c++ - 我自己 pthread_join 是否可以接受并且安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464833/