0
为什么这个线程继续执行,但我杀了它?POSIX - pthread_kill()?
pthread_t pid;
pthread_create(&pid, NULL, (func)countdown, NULL);
pthread_kill(pid, 1);
pthread_join(pid, NULL);
为什么这个线程继续执行,但我杀了它?POSIX - pthread_kill()?
pthread_t pid;
pthread_create(&pid, NULL, (func)countdown, NULL);
pthread_kill(pid, 1);
pthread_join(pid, NULL);
pthread_kill
是发送信号到线程的函数。您目前正在向它发送信号1
,即SIGHUP
。用于请求或迫使终止的标准信号分别是SIGTERM
和SIGKILL
,它们分别是15
和9
。
此外,你应该使用常量而不是幻数来发送信号。这些在signal.h
中定义。 signal documentation会给你更多的细节。
更新:每个nos的评论,终止线程(而不是整个应用程序)的正确方法是使用pthread_cancel
。我上面描述的pthread_kill
的用法将倾向于杀死整个进程,假设接收线程不注册信号处理程序。
终止线程的方法是使用pthread_cancel,而不是pthread_kill(但即使这需要非常小心)。使用pthread_kill,如果动作终止,则整个过程终止,而不仅仅是线程。 – nos
@nos,感谢您的纠正。我会更新我的答案。 – merlin2011
是的,'pthread_cancel'是'取消POSIX线程'的适当方式,但我敢说,'正确'的方式'取消'线程是使用某种条件对象(或者是'pthread_cond'类型或者只是一个简单的'bool'或'int')在线程中检查...取消一个线程(在POISX或Windows中)可能会对应用程序产生负面影响,并导致可能的堆栈损坏问题(尽管您大多数时候可能会很幸运,而不是“看到”这些错误)。 – txtechhelp