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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章