当前位置: 技术问答>linux和unix
pthread的高级问题?
来源: 互联网 发布时间:2015-06-29
本文导语: 大家可以做一个测试,我在RED HAT 8.0 写了一个小程序: #include #include void *run(void *arg) { sleep(30); } int main() { pthread_t id; pthread_create(&id,NULL,run,NULL); sleep(100); } 运行后,用 ps -ef 查看时只显示一个进程 P...
大家可以做一个测试,我在RED HAT 8.0 写了一个小程序:
#include
#include
void *run(void *arg)
{
sleep(30);
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,run,NULL);
sleep(100);
}
运行后,用 ps -ef 查看时只显示一个进程
PID PPID name
1234 200 a.out
用 ps -efm 查看进程线程时:
PID PPID name
1234 200 a.out
1235 1234 a.out
1236 1235 a.out
我现在可以说: 1234 是进程ID,1235 是主线程ID,1236是创建的线程ID,运行函数是run.一般来说主线程1235是不会defunct的.因为我们没法处理.但是我的程序就出现了,当运行到三五天.就会出现如下状态:
PID PPID name
1234 200 a.out
1235 1234 a.out(defunct)
1236 1 a.out
现在问题是 1235 号线程是怎么僵死的? 什么原因可能导致?
( 可以通过发送 kill -9 1235 出现这种状态. 但发送kill -9 1234 或 kill -9 1236,a.out 程序都退出.)
谢谢?
#include
#include
void *run(void *arg)
{
sleep(30);
}
int main()
{
pthread_t id;
pthread_create(&id,NULL,run,NULL);
sleep(100);
}
运行后,用 ps -ef 查看时只显示一个进程
PID PPID name
1234 200 a.out
用 ps -efm 查看进程线程时:
PID PPID name
1234 200 a.out
1235 1234 a.out
1236 1235 a.out
我现在可以说: 1234 是进程ID,1235 是主线程ID,1236是创建的线程ID,运行函数是run.一般来说主线程1235是不会defunct的.因为我们没法处理.但是我的程序就出现了,当运行到三五天.就会出现如下状态:
PID PPID name
1234 200 a.out
1235 1234 a.out(defunct)
1236 1 a.out
现在问题是 1235 号线程是怎么僵死的? 什么原因可能导致?
( 可以通过发送 kill -9 1235 出现这种状态. 但发送kill -9 1234 或 kill -9 1236,a.out 程序都退出.)
谢谢?
|
默认情况id线程不会自行结束的
要用pthread_join(),或是设置id线程属性为PTHREAD_CREATE_DETACHED(分离线程)
|
int main()
{
pthread_t id;
pthread_create(&id,NULL,run,NULL);
while(1)
{}
}
主线程退出了!!加while(1){}不要退出主线程试试看!
{
pthread_t id;
pthread_create(&id,NULL,run,NULL);
while(1)
{}
}
主线程退出了!!加while(1){}不要退出主线程试试看!
|
http://www-900.ibm.com/developerWorks/cn/linux/kernel/l-thread/index.shtml
参考一下
参考一下