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

时间:2013-05-09 14:56:50

标签: c++ thread-safety pthreads

我的设置有点像这样:

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

我的问题是:这样做是否可以,如果是这样安全吗? (因此忽略了连接失败,因为我会在一瞬间很好地结束线程?)或者,它是否应该避免?

3 个答案:

答案 0 :(得分:4)

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

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

    作为一种解决方案,我建议您重新审视设计并确保在正确的时间和地点调用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(),并冒着失败的风险。