Linux 多线程环境下 进程线程终止函数小结

来源:互联网 发布:淘宝定价策略 编辑:程序博客网 时间:2024/06/06 00:57

Linux 多线程环境下 进程线程终止函数小结

pthread_kill:

pthread_kill与kill有区别,是向线程发送signal。,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。

int pthread_kill(pthread_t thread, int sig);

向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出

pthread_kill(threadid, SIGKILL)杀死整个进程。 如果要获得正确的行为,就需要在线程内实现signal(SIGKILL,sig_handler)。所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,否则,就会影响整个进程。

如果int sig是0呢,这是一个保留信号,一个作用是用来判断线程是不是还活着。pthread_kill的返回值: 成功:0 线程不存在:ESRCH 信号不合法:EINVAL

代码:

复制代码
int kill_rc = pthread_kill(thread_id,0);if(kill_rc == ESRCH)         printf("the specified thread did not exists or already quit\n"); else if(kill_rc == EINVAL)         printf("signal is invalid\n"); else         printf("the specified thread is alive\n");
复制代码

 

pthread_cancel

函数原型:

int pthread_cancel(pthread_t thread);

向thread发送一个取消执行的请求。如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。成功返回零,出错返回非零的出错码ESRCH:没有找到thread指定ID的线程。

 

abort和exit的比较

exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序。如果有函数通过atexit来注册,还会按照atexit的相反顺序调用注册的函数。不过,如果atexit函数扔出异常的话,就会直接调用terminate。

abort:立刻terminate程序,没有任何清理工作。

 

 

这里附上线程基本函数:

------------------------------------------------------------------------------------------
                     POSIX函数                                                    描述
-------------------------------------------------------------------------------------------
                    pthread_create                                    创建一个线程
                    pthread_self                                        找出自己的线程ID
                    pthread_equal                                     测试2个线程ID是否相等
                    pthread_detach                                   设置线程以释放资源
                    pthread_join                                        等待一个线程
                    pthread_cancel                                    终止另一个线程
                    pthread_exit                                        退出线程,而不退出进程
                    pthread_kill                                         向线程发送一个信号
-------------------------------------------------------------------------------------------

关于线程的终止:

Linux】线程总结:初识、创建、等待、终止、分离

线程的创建、等待、终止、分离、同步和互斥

Linux线程-终止

终止线程的三种方式

(1):从线程函数中直接return,主线程return表示所有的线程退出了。
(2):线程退出不能调用exit,如何任意一个线程调用了exit或_exit,则整个进程的所有线程都终止。使用pthread_exit函数终止自己的线程。
void pthread_exit(void *retval); 参数是返回的错误码,想要获得这个错误码,可以通过pthred_join来获得。
(3):使用pthread_cancel函数,可以用来取消进程。  自己可以取消,也可以被别人取消,一般是主线程取消新线程。int pthread_cancel(pthread_t thread); 参数为要终止的线程的tid.

5.线程分离:
int pthread_detach(phtread_t thread);
当我们把新线程设为可分离的时,这个时候主线程不再等待新线程,分离以后,这个时候的新线程是由操作系统来进行考虑的。
不再由主线程来考虑,这主线程中分离,这个时候主线程知道与新线程分离,主线程是不能调用pthread_join来进行等待的。

注:一般情况下新线程是默认可结合的,需要被主线程回收资源和杀死,一个可结合的线程会容易出现类似于僵尸进程的问题。
一般采用pthread_join来等待。否则就会出现主线程无法获取新线程信息,无法回收线程的资源,会造成内存泄露











阅读全文
0 0
原创粉丝点击