我也会推荐使用选择或其他一些非信号手段来终止你的线程。我们有线索的原因之一是尝试摆脱信号疯狂。这就是说...
通常一个人使用pthread_kill()与SIGUSR1或SIGUSR2向线程发送信号。其他建议的信号 - SIGTERM,SIGINT,SIGKILL - 具有您可能不感兴趣的全过程语义。
至于发送信号时的行为,我的猜测是它与如何处理你处理了信号。如果您没有安装处理程序,则会应用该信号的默认操作,但会在接收信号的线程的上下文中应用。因此,例如,SIGALRM将由您的线程“处理”,但处理将包括终止进程 - 可能不是期望的行为。
线程接收到的信号通常会将其从EINTR读取中分离出来,除非它确实处于前面回答中提到的那种不可中断状态。但我认为这不是,或者您对SIGALRM和SIGIO的实验不会终止这个过程。
您的阅读也许在某种循环?如果读取以-1返回终止,则跳出该循环并退出该线程。
你可以用这个非常草率的代码,我放在一起测试一下我的假设玩 - 我是一对夫妇从时区,此刻我的POSIX的书拿走的......
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
int global_gotsig = 0;
void *gotsig(int sig, siginfo_t *info, void *ucontext)
{
global_gotsig++;
return NULL;
}
void *reader(void *arg)
{
char buf[32];
int i;
int hdlsig = (int)arg;
struct sigaction sa;
sa.sa_handler = NULL;
sa.sa_sigaction = gotsig;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
if (sigaction(hdlsig, &sa, NULL) < 0) {
perror("sigaction");
return (void *)-1;
}
i = read(fileno(stdin), buf, 32);
if (i < 0) {
perror("read");
} else {
printf("Read %d bytes\n", i);
}
return (void *)i;
}
main(int argc, char **argv)
{
pthread_t tid1;
void *ret;
int i;
int sig = SIGUSR1;
if (argc == 2) sig = atoi(argv[1]);
printf("Using sig %d\n", sig);
if (pthread_create(&tid1, NULL, reader, (void *)sig)) {
perror("pthread_create");
exit(1);
}
sleep(5);
printf("killing thread\n");
pthread_kill(tid1, sig);
i = pthread_join(tid1, &ret);
if (i < 0)
perror("pthread_join");
else
printf("thread returned %ld\n", (long)ret);
printf("Got sig? %d\n", global_gotsig);
}
来源
2008-10-15 08:29:21
bog
QQQ似乎有正确答案,不幸的是有极少数的选票。 `pthread_cancel`是解决您的问题的方法。 – 2010-09-27 03:30:19
只要线程仍然被阻塞,它不会造成任何伤害。问题是如果线程在你关闭的时候醒来。所以解决的办法是在阻塞线之后放置一些代码,以阻止线程执行任何操作*其他*如果正在关闭进程。 – 2011-09-28 17:15:12
类似的问题和可能的解决方案有讨论:[文件描述符和多线程程序(http://www.ddj.com/hpc-high-performance-computing/212001285) – dmityugov 2008-11-10 12:58:48