日期:2014-05-16  浏览次数:20702 次

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)
所以子线程永远都不会退出。
------解决方案--------------------
引用:
谢谢大神指点,请问如果这里要退出while(1),怎么实现呢?用switch能不能实现。

用goto
------解决方案--------------------
或者将while(1)改为while(running),然后在switch里修改running为0
------解决方案--------------------
还有,你要是需要直接退出线程的话可以用pthread_exit
------解决方案--------------------
引用:
好的,谢谢各位的指点!!!


可以结贴了