Linux 多线程开发-线程的结束pthread_kill和pthread_cancel
生活随笔
收集整理的這篇文章主要介紹了
Linux 多线程开发-线程的结束pthread_kill和pthread_cancel
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、線程結束的方式
- (1)線程函數中調用pthread_exit函數,不會導致對象析構,可以使用
- (2)線程所屬的進程結束,進程調用exit,線程C++對象不會銷毀,不安全,屬于被動結束
- (3)線程函數執行返回return,好的退出方式
- (4)線程被同一進程或其他線程通知結束,屬于被動結束
2、線程主動結束
線程主動結束使用return或者pthread_exit函數,原型如下:
void pthread_exit(void *retval);retval是線程返回給主線程的值,線程函數返類型是void *。在main線程中調用pthread_exit(NULL)將結束main線程,但是進程不立即退出。
示例:
#include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h>void thread_fun(void *arg) {static int count = 1;//必須靜態,傳出的地址不改變pthread_exit((void*)&count); } int main(int argc,char * argv[]) {int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_join(pid,(void**)&pretv);printf("thread fun retval:%d\n",*pretv);return 0; }3、線程被動結束
線程被動結束的兩種方法:
- 同一進程的其他線程中通過函數pthread_kill發送信號給要結束的進程,目標進程收到后再退出
- 同一進程的其他線程中通過函數pthread_cancel取消目標的執行
pthread_kill的函數原型:
void pthread_kill(pthread_t pid, int signal);pid:接收信號線程的線程ID;signal就是信號,大于0的值,如果等于0就是探測線程是否存在,執行成功返回0,否則返回錯誤碼,ESRCH線程不存在,EINVAL信號不合法。
向指定線程發送信號,如果線程代碼不處理,則調用信號的默認處理方法。線程信號例如:Linux 進程通信 -- 信號
https://blog.csdn.net/u010058695/article/details/102787168
pthread_cancel的函數原型:
void pthread_cancel(pthread_t pid);pid:要被取消線程的ID,向指定線程發送取消執行的請求,請求終止,但不一定就終止,系統不會馬上取消線程,只有在被取消線程下次調用一些C庫函數如printf或者pthread_testcancel(讓內核去檢測是否需要取消當前線程)時,才會真正結束,在線程執行過程中檢測是否有未響應取消信號的地方叫做取消點。
示例:
#include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h>void thread_fun(void *arg) {int count = 0;while(1){i++;pthread_testcancel();}return; } int main(int argc,char * argv[]) {int *pretv;int pid;if(0 != pthread_creat(&pid,NULL,(void *(*)(void *))thread_fun,NULL)){printf("pthread creat error\n");return -1;}pthread_cancel(pid);pthread_join(pid,(void**)&pretv);return 0; }總結
以上是生活随笔為你收集整理的Linux 多线程开发-线程的结束pthread_kill和pthread_cancel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始学Android(一)
- 下一篇: 实例38:python