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;
}