2

我有一个有点像这样的设置:

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(),它将返回 a 。EDEADLK

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

4

3 回答 3

5

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

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

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

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

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

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

于 2013-05-17T14:58:38.800 回答
1
   The pthread_join() function may fail if:

   EDEADLK
          A deadlock was detected or the value  of  thread  specifies  the
          calling thread.

我会说使用风险自负。

于 2013-05-09T15:04:25.040 回答
1

为什么不让线程调用pthread_detach(pthread_self());然后退出。无需再打电话pthread_join()并冒着失败的风险。

于 2013-05-17T14:45:38.330 回答