Linux 多线程开发-线程的结束pthread_kill和pthread_cancel
1、线程结束的方式(1)线程函数中调用pthread_exit函数,不会导致对象析构,可以使用(2)线程所属的进程结束,进程调用exit,线程C++对象不会销毁,不安全,属于被动结束(3)线程函数执行返回return,好的退出方式(4)线程被同一进程或其他线程通知结束,属于被动结束2、线程主动结束线程主动结束使用return或者pthread_exit函数,原型如下:v...
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;
}
更多推荐
所有评论(0)