日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 多线程开发-线程的结束pthread_kill和pthread_cancel

發布時間:2023/12/10 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。