当前位置: 技术问答>linux和unix
一个关于线程退出的问题
来源: 互联网 发布时间:2015-08-17
本文导语: 1.针对windows平台,线程函数在return后或自己调用_endthread后会自动退出,那么如果存在一个 陷入死循环的线程函数,当主进程推出时,这个线程会退出吗? 2.在unix平台下,我们可以在线程外部结束另一个线程吗?当主...
1.针对windows平台,线程函数在return后或自己调用_endthread后会自动退出,那么如果存在一个
陷入死循环的线程函数,当主进程推出时,这个线程会退出吗?
2.在unix平台下,我们可以在线程外部结束另一个线程吗?当主进程推出时,这个陷入死循环的线程会退出吗?
陷入死循环的线程函数,当主进程推出时,这个线程会退出吗?
2.在unix平台下,我们可以在线程外部结束另一个线程吗?当主进程推出时,这个陷入死循环的线程会退出吗?
|
刚才打字打错了,给thread发信号用pthread_kill,但是注意有一个问题,就是有可能指定的thread已经终止了,而thread id 被另外一个thread重用。实际上pthread_cancel也有这个问题~~
|
问题1:不清楚
问题2:可以通过信号来结束线程,只要你知道了tid,可以用tr_kill来给指定的thread发送signal来stop指定的thread,也可以用pthread_cancel来结束一个thread;
通常情况下,一旦main函数返回就标志着进程结束了,那么一切该进程下的thread也都自动的结束了。但是如果你在main函数中调用了pthread_exit的话,即便main结束了,进程也要等到所有thread结束才会退出。
问题2:可以通过信号来结束线程,只要你知道了tid,可以用tr_kill来给指定的thread发送signal来stop指定的thread,也可以用pthread_cancel来结束一个thread;
通常情况下,一旦main函数返回就标志着进程结束了,那么一切该进程下的thread也都自动的结束了。但是如果你在main函数中调用了pthread_exit的话,即便main结束了,进程也要等到所有thread结束才会退出。
|
子进程运行结束后(正常或异常),并没有马上从系统的进程分配表中被删掉,而是进入僵死状态(Zombie),一直等到父进程来回收它的结束状态信息。
如果父进程没有回收走子进程的结束状态就已经退出,子进程将永远处于僵死状态;也有例外,如父进程先于子进程结束,子进程将被init进程继承,并回init进程回收其结束状态信息。
如果父进程没有回收走子进程的结束状态就已经退出,子进程将永远处于僵死状态;也有例外,如父进程先于子进程结束,子进程将被init进程继承,并回init进程回收其结束状态信息。
|
线程啊。。。在调用exit,或者从main中return,所有线程都会结束。
在线程外终止线程:pthread_cancel();这个调用。不过只能在某些情况下起作用,比如阻塞的系统调用等。
在线程外终止线程:pthread_cancel();这个调用。不过只能在某些情况下起作用,比如阻塞的系统调用等。
|
在线程外终止线程:pthread_cancel();这个调用。不过只能在某些情况下起作用,比如阻塞的系统调用等。
----------------------------
使用pthread_cancel 可以外部结束线程,注意不要把线程设成了detached否则不能取消。
阻塞时也能取消线程,我曾经取消了带有阻塞接收数据recvfrom函数的线程没什么问题,
但是有些资源比如socket需要编写pthread_cleanup_push调用的一个函数来释放资源
----------------------------
使用pthread_cancel 可以外部结束线程,注意不要把线程设成了detached否则不能取消。
阻塞时也能取消线程,我曾经取消了带有阻塞接收数据recvfrom函数的线程没什么问题,
但是有些资源比如socket需要编写pthread_cleanup_push调用的一个函数来释放资源
|
程序中好像是用信号函数signal、wait等处理进程终止的,看看Posix信号处理部分
|
uinx平台下外部可以结束另一个进程,因为进程间可以传递信号,但要在进程设置信号处理。另外init进程以可以杀死任意进程,当主进程推出时,如果不处理的话,陷入死循环的线程不会退出