C11:使用标准库杀死线程

问题描述 投票:0回答:1

如何使用

<threads.h>
中提供的函数来杀死 C 中的线程?似乎没有“直接”的方法可以做到这一点。注意:我知道 pthreads 提供了 pthread_cancel() 函数,但我想坚持使用
<threads.h>
函数。
    

multithreading standards c11
1个回答
0
投票

枚举 C11 标准为

<threads.h>

定义的 8 个函数,迭代它们并确定它们都没有达到您想要的效果,这很简单。

因此,如所写,您的要求无法得到满足。如果这就是您所关心的,那么您可以停止阅读此处。

如果您关心实用的解决方案,那么这取决于您想要解决的
实际

问题:

如果线程卡在您编写的代码中的某个位置,那么您只需添加一个
    _Atomic
  • 变量并重复检查它。无论如何,这几乎就是
    pthread_cancel
    正在做的事情。
    如果您有一个线程卡在您调用的代码中的某个位置但无法控制,那么您需要现有的同步点。如果您调用的代码使用 
  • pthread_cancel
  • 声明为同步点的系统调用,那么您可以使用它。如果没有,那么您将不得不利用抢占,这会进入特定于操作系统的领域。在 POSIX 系统上,您可以在除目标线程之外的所有线程上屏蔽给定信号,并且当引发该信号时,它必然会在目标线程上引发。较低级别的 API 可能用于从调度池中删除线程并清理其内核状态,但这不会清理其用户态状态。尽管您声称,在您的情况下,他们“不使用资源”,但至少会有一个堆栈需要清理,而且很可能还有
    thrd_*
    -API 簿记数据。
    如果你有一个线程陷入内核模式,那么你绝对无能为力。没有上帝,甚至
  • SIGKILL
  • 也不能拯救你,没有内核可以从杀死内核中具有活动调用堆栈的线程中恢复正常,你所能做的就是拉动电源弦。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.