Linux中pthread_join等待无法返回
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
pthread_t ntid;
sigset_t set;
void *child_thread(void *p)
{
int signum;
while(1)
{
sigwait(&set, &signum);
switch(signum)
{
case SIGUSR1:
printf("pthread running.\n");
continue;
case SIGUSR2:
printf("sleep 2s quit.\n");
sleep(1);
break;
default:
printf("no symbol..\n");
}
}
sigdelset(&set, SIGUSR2);
}
int main()
{
int retu;
char tmpc;
void *status;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
sigprocmask(SIG_SETMASK,&set,NULL);
retu = pthread_create(&ntid, NULL, child_thread, NULL);
if(retu < 0)
{
printf("create thread fail,rerurn.\n");
return -1;
}
while(1)
{
printf("Please input a char.\n");
scanf("%c",&tmpc);
switch(tmpc)
{
case 'a':
pthread_kill(ntid, SIGUSR1);
continue;
case 'q':
pthread_kill(ntid, SIGUSR2);
pthread_join(ntid,&status);
printf("finish\n");
break;
default:
printf("unknown symbol..\n");
}
}
return 0;
}
上面的程序,如果输入q,主线程无法退出,一直在等待,本来是在子线程sleep 1s后子线程退出,然后主线程也退出的啊
------解决方案--------------------你的break只能退出switch不能退出while(1)
所以子线程永远都不会退出。
------解决方案--------------------
用goto
------解决方案--------------------或者将while(1)改为while(running),然后在switch里修改running为0
------解决方案--------------------还有,你要是需要直接退出线程的话可以用pthread_exit
------解决方案--------------------
可以结贴了