我自己 pthread_join 是否可以接受且安全?

nit*_*itz 2 c++ pthreads thread-safety

我的设置有点像这样:

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*/ }
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,Shutdown()从主线程调用,而在其他一些情况下,我想从线程本身内部调用关闭(之后立即从该线程返回)。

的文档说,如果调用线程与传递的线程相同,pthread_join()它将返回 a 。EDEADLK

我的问题是:这样做可以吗?如果可以的话安全吗?(因此忽略连接失败,因为无论如何我很快就会很好地结束线程?)或者,这是应该避免的事情吗?

小智 5

您当然可以pthread_join()从正在运行的线程本身调用,并且您已经发现调用本身会正确处理它,并为您提供错误代码。但是,有几个问题:

  1. 这没有任何意义,因为加入不会加入任何东西。它只会告诉你你做错了什么。
  2. 线程本身不会在调用时退出 pthread_join()自身时。
  3. 即使线程存在,它的状态也不会被正确清理。pthread_join()除非线程被创建为“分离”,否则一些其他线程(即您的应用程序的主线程)应该调用。

因此,换句话说,这种方法与程序中的错误一样可以接受。

作为解决方案,我建议重新审视设计并确保Shutdown()在正确的时间和地点调用它。毕竟,“关机”这个名字在这里没有多大意义,因为它不会关闭任何东西。它所做的只是等待线程完成并在此之后清理其状态。

当你想结束工作线程时,要么从线程例程返回,要么调用pthread_exit(). 然后确保启动线程的人通过调用pthread_join().

如果您想强制线程停止,请考虑使用pthread_kill()向线程发出信号,或者实现某种消息传递,您可以使用它来“告诉”线程停止执行其正在执行的任何操作。