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