【发布时间】:2017-09-20 13:31:50
【问题描述】:
我找不到将线程 ID (pid_t) 转换为 pthread_t 的函数,这将允许我调用 pthread_cancel() 或 pthread_kill()。
即使 pthreads 不提供一个,是否有特定于 Linux 的功能? 我认为不存在这样的功能,但我很乐意得到纠正。
背景
我很清楚,通常最好让线程通过条件变量等来管理自己的生命周期。
此用途用于测试目的。我正在尝试找到一种方法来测试应用程序在其中一个线程“死亡”时的行为。所以我真的在寻找一种方法来杀死一个线程。使用syscall(tgkill()) 会杀死进程,因此我提供了一种方法让测试人员为进程提供要杀死的线程的ID。我现在需要将该 id 转换为 pthread_t 以便我可以:
- 使用
pthread_kill(tid,0)检查其是否存在,然后 - 酌情致电
pthread_kill()或pthread_cancel()。
这可能将测试带到了不必要的极端。如果我真的想这样做,那么某种模拟 pthreads 实现可能会更好。
确实,如果您真的想要强大的隔离,您通常最好使用进程而不是线程。
【问题讨论】:
-
我不认为你可以。无论如何,这可能会对您有所帮助unix.stackexchange.com/questions/1066/…
-
pthread_kill不会杀死线程,它会发送一个信号(它可以关闭整个进程)。无论如何,你到底为什么还要处理内核线程ID?他们甚至没有被 glibc 暴露。 -
Pthread_t 是不透明的,因此我无法指定要终止的特定线程。但是, ps 或 top -H 可以从命令行显示线程 ID。您可以设置信号掩码,以便信号仅发送到特定线程。在这种情况下 pthread_kill() 可能会被安全地处理。