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)
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;
pthread_kill和pthread_cancel
为了讲述标题两个函数,必须先介绍一下pthread线程库。
pthread线程库是遵循POSIX标准开发的,工作非常稳定,性能也不差,
所以在Linux下是最常用的线程库。但从调用上看,pthread线程应该仍然属于用户级的线程库,
其实用户级还是内核级的关键区别只在于线程的调度是由内核还是用户库来完成,用户级对于
一般的服务器工作
该函数可以用于向指定的
线程发送信号:
int
pthread_
kill(
pthread_t threadId,int signal);
如果
线程内不对信号进行处理,则调用默认的处理程式,如SIGQUIT会退出终止
线程,SIG
KILL会杀死
线程等等,可以调用signal(SIGQUIT, sig_process_routine); 来自定义信号的处理程序。
pthread_kill函数的功能是向指定线程发送信号,信号为0时用于检查此线程ID的线程是否存活。
pthread_cancel函数的功能是给线程发送取消信号,使线程从取消点退出。(http://baike.baidu.com/view/8517720.htm)
请在创建的线程中使用signal(SIGKILL,sig_handler)处理信号,如果你给一个线程发送了SIGQUIT,但线程却
为了讲述标题两个函数,必须先介绍一下pthread线程库。
pthread线程库是遵循POSIX标准开发的,工作非常稳定,性能也不差,
所以在Linux下是最常用的线程库。但从调用上看,pthread线程应该仍然属于用户级的线程库,
其实用户级还是内核级的关键区别只在于线程的调度是由内核还是用户库来完成,用户级对于
一般的服务器工作而言是没用问题的。
pthread_kill函数的功能是
1、int pthread_kill(pthread_t thread, int sig);
功能是向指定线程发送信号,信号为0时用于检查此线程ID的线程是否存活。
pthread_kill的返回值:
线程不存在:ESRCH
信号不合法:EINVAL
2、pthread_cancel(pthread_t
thread);
功能是给线程发送取消信号,使线程从取消点
pthread_kill 与pthread_cancel使用方法#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INIT
Pthread是 POSIX threads 的简称,是POSIX的
线程标准。
终止
线程似乎是
多线程编程的最后一步,但绝不是本系列教材的
结束。
线程创建到
线程终止,希望先给读者一个关于
多线程编程的总体认识。
1.终止
Pthread线程:
pthread_exit()
1.函数作用
1>
pthread_
kill()函数的作用是向某个
线程传递一个信号
2>[注意]创建的
线程中使用signal(SIG
KILL,sig_handler)函数去处理对应的信号,如果你给一个
线程发送了SIGQUIT,
但
线程却没有实现signal处理函数,则整个进程退出
信号的设置:signal函数
2.函数原型
#include <
pthread.h>
#include<signal.h>
int
pthread_ki