【问题标题】:How to know if a pthread died如何知道 pthread 是否死亡
【发布时间】:2015-07-24 03:39:40
【问题描述】:

如何知道 pthread 是否死亡?

有没有办法检查 pthreads 的状态?

【问题讨论】:

  • 需要注意的是线程不能只是“死”。可以在不终止整个进程的情况下终止线程的唯一方法是:(1)从它的启动函数返回,(2)调用pthread_exit,(3)调用一个作为取消点的函数,而取消没有被阻塞,并且pthread_cancel 已被调用,或者 (4) 在异步取消生效时成为 pthread_canel 的目标。

标签: pthreads


【解决方案1】:
if(pthread_kill(the_thread, 0) == 0)
{
    /* still running */
}

见:pthread_kill

注意:使用 pthread_kill() 测试是否存在固有风险 线程仍在运行。请参阅此帖子以获取解释: How do I determine if a pthread is alive?

【讨论】:

  • 这将首先杀死线程,还是尝试这样做。或者它只会检查它?谢谢
  • 来自上面的链接:“如同在kill()中,如果sig是零,将执行错误检查但实际上不会发送信号”。这意味着不,它不会杀死线程。它只会告诉你它是否还在那里。
  • @Damon:顺便说一句,这个“the_thread”是线程的名称,是真正的线程吗?还是线程的返回值?例如gpsNavigationThreadResult = pthread_create(&gpsNavigationThread, NULL, setupgpsnavigation, (void*) message3);
  • 这是您从pthread_create 获得的pthread_t(即线程ID)。
  • 此代码仅在 the_thread 可加入且尚未加入时有效。如果它已加入或已分离,则在其生命周期之后对其线程 ID 的任何使用(包括pthread_kill)都会导致非常危险未定义的行为。
【解决方案2】:

如果您不需要编写可移植的应用程序并且可以使用 GNU 扩展,则可以使用pthread_tryjoin_np。我相信没有其他方法可以做到这一点,除了在两个线程之间建立通信(例如,使用只要线程活着就被线程持有的全局互斥锁)。

【讨论】:

    【解决方案3】:

    我想在讨论中添加一个事实,即当宿主进程或它自己的线程不处理时,线程可能会在另一种情况下死掉,这在此处未提及的信号(例如 SIGPIPE)的情况下在可能出现此类信号的情况下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多