一、pthread_kill()函数介绍
1.函数作用
1>pthread_kill()函数的作用是向某个线程传递一个信号
2>[注意]创建的线程中使用signal(SIGKILL,sig_handler)函数去处理对应的信号,如果你给一个线程发送了SIGQUIT,
但线程却没有实现signal处理函数,则整个进程退出
信号的设置:signal函数
2.函数原型
#include <pthread.h>
#include<signal.h>
int pthread_kill(pthread_t thread, int sig);
参数:参数1:线程id 参数2:要发送给线程的信号
返回值:成功:0 线程不存在:ESRCH 信号不合法:EINVAL
3.判断线程是否存在
当我们给线程发送一个0就可以判断线程是否存在pthread_kill(tid, 0);
程序demon
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
int thread_id1,thread_id2;
void *function1(void *arg)
thread_id1=pthread_self();
printf("start thread1 id = %x \n",thread_id1);
return;
void *function2(void *arg)
thread_id2=pthread_self();
printf("start thread2 id = %x \n",thread_id2);
sleep(3);
return;
int main()
pthread_t tid1,tid2;
if(-1==pthread_create(&tid1,NULL,function1,NULL))
printf("tid1 create fail\n");
pthread_detach(tid1);
if(-1==pthread_create(&tid2,NULL,function2,NULL))
printf("tid1 create fail\n");
pthread_detach(tid2);
sleep(1);
int kill_ret1 = pthread_kill(tid1,0);
if(kill_ret1 ==ESRCH)
printf("线程1不存在 id = %x \n",thread_id1);
}else if(kill_ret1 == 0){
printf("线程1存活 id = %x \n",thread_id1);
int kill_ret2 = pthread_kill(tid2,0);
if(kill_ret2 == ESRCH)
printf("线程2不存在 id = %x \n",thread_id2);
}else if(kill_ret2 == 0){
printf("线程2存活 id = %x \n",thread_id2);
sleep(2);
return 0;
运行结果:
一、pthread_kill()函数介绍1.函数作用1>pthread_kill()函数的作用是向某个线程传递一个信号2>[注意]创建的线程中使用signal(SIGKILL,sig_handler)函数去处理对应的信号,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出信号的设置:signal函数2.函数原型#include <pthread.h>#include<signal.h>int pthread_ki
最近开发一些东西,线程数非常之多,当用户输入Ctrl+C的情形下,默认的信号处理会把程序退出,这时有可能会有很多线程的资源没有得到很好的释放,造成了内存泄露等等诸如此类的问题,本文就是围绕着这么一个使用场景讨论如何正确的终止正在运行的子线程。其实本文更确切的说是解决如何从待终止线程外部安全的终止正在运行的线程
首先我们来看一下,让当前正在运行的子线程停止的所有方法
1.任何一个线程调用exit
2.pthread_exit
3.pthread_kill
4.pthread_cancel
下面我们一一分析各种终止正在运行的程序的方法
任何一个线程调用exit
任何一个线程只要调用了exit都会
判断线程运行状态的方法有很多,如可以采用类似于对象计数器的方法,所谓对象计数器,就是一个对象被引用一次,这个计数器就加1,销毁引用就减1,如果引用数为0,则垃圾搜集器就会对这些引用数为0的对象进行回收。
判断线程运行状态方法一:线程计数器
线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最
一:线程信号相关函数
1.pthread_kill()函数
该函数其实不是kill线程,而是向线程发送一个signal(线程所有函数中最名不符其实的函数吧。。。)
成功返回0,失败返回失败码。
第一个参数:要发送信号的线程tid。
第二个参数:0是保留信号,用来判断线程是否还存在
sig信号 (在/usr/include/
(1)线程函数中调用pthread_exit函数,不会导致对象析构,可以使用
(2)线程所属的进程结束,进程调用exit,线程C++对象不会销毁,不安全,属于被动结束
(3)线程函数执行返回return,好的退出方式
(4)线程被同一进程或其他线程通知结束,属于被动结束
2、线程主动结束
线程主动结束使用return或者pthread_exit函数,原型如下:
pthread_kill
pthread_kill函数是用来向线程发送signal。类似于我们在linux下使用kill命令向指定的进程发送signal。
函数原型:
pthread_kill - send a signal to a thread
SYNOPSIS
#include <signal.h>
int pthread_kill(pthread_t thread, int sig);
DESCRIPTION
The pthread_kill()
向线程函数传递参数的程序示例;
一个资源包,执行 tar zxvf example.tar.gz 解压资源;
复制readme.txt中的编译语句,编译得到可执行程序threadtest;
./threadtest 执行皆可看到效果。
pthread_kill()函数用于向指定线程发送信号,可以用它来中断线程或者让线程退出。但是,使用pthread_kill()函数退出线程并不是一个好的方法,因为它并不能保证线程可以安全退出。
如果一个线程正在执行某个系统调用,比如read()或者write(),那么这个线程将被阻塞,此时向该线程发送信号是不会起作用的。如果使用pthread_kill()函数强制退出线程,可能会导致一些资源无法释放,从而导致内存泄漏等问题。
因此,一般不建议使用pthread_kill()函数来退出线程,而是使用pthread_exit()函数或者让线程自动退出。