2014-04-08 35 views
0

为什么这个线程继续执行,但我杀了它?POSIX - pthread_kill()?

pthread_t pid; 
pthread_create(&pid, NULL, (func)countdown, NULL); 
pthread_kill(pid, 1); 
pthread_join(pid, NULL); 

回答

1

pthread_kill是发送信号到线程的函数。您目前正在向它发送信号1,即SIGHUP。用于请求或迫使终止的标准信号分别是SIGTERMSIGKILL,它们分别是159

此外,你应该使用常量而不是幻数来发送信号。这些在signal.h中定义。 signal documentation会给你更多的细节。

更新:每个nos的评论,终止线程(而不是整个应用程序)的正确方法是使用pthread_cancel。我上面描述的pthread_kill的用法将倾向于杀死整个进程,假设接收线程不注册信号处理程序。

+2

终止线程的方法是使用pthread_cancel,而不是pthread_kill(但即使这需要非常小心)。使用pthread_kill,如果动作终止,则整个过程终止,而不仅仅是线程。 – nos

+0

@nos,感谢您的纠正。我会更新我的答案。 – merlin2011

+3

是的,'pthread_cancel'是'取消POSIX线程'的适当方式,但我敢说,'正确'的方式'取消'线程是使用某种条件对象(或者是'pthread_cond'类型或者只是一个简单的'bool'或'int')在线程中检查...取消一个线程(在POISX或Windows中)可能会对应用程序产生负面影响,并导致可能的堆栈损坏问题(尽管您大多数时候可能会很幸运,而不是“看到”这些错误)。 – txtechhelp