【Linux多线程编程-自学记录】05.取消线程
Linux多线程编程学习代码(代码已上传gitee,还请各位兄弟点个Star哦!)
https://gitee.com/chenshao777/linux_thread.git
笔记:
1.取消函数
int pthread_cancel ( pthread_t tid )
取消tid指定的线程,成功返回0。
但是取消只是发送一个请求,并不意味着等待线程终止,而且发送成功也不意味着tid一定会终止
2.取消状态(忽略或者响应)
就是线程对取消信号的处理方式,忽略或者响应。线程创建时 “默认响应取消信号”
int pthread_setcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:
PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,
分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行﹔
old_state如果不为NULL则存入原来的Cancel状态以便恢复。
3.取消类型(立即取消或者延时取消)
是线程对取消信号的响应方式,立即取消或者延时取消。线程创建时 “默认延时取消”
int pthread_setcanceltype(int type, int *oldtype)
设置本线程取消动作的执行时机,type由两种取值:
PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYNCHRONOUS,
仅当Cancel状态为Enable时有效,
分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作〈退出〉﹔ oldtype如果不为NULL则存入运来的取消动作类型值。
4.取消点(man pthreads可以查看)
取消一个线程,它通常需要被取消线程的配合。
线程在很多时候会查看自己是否有取消请求如果有就主动退出,这些查看是否有取消的地方称为取消点
很多地方都是包含取消点,包括
pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait() 、
sem_wait()vsigwait() 、 write 、 read, 大多数会阻塞的系统调用
spu.h文件
#ifndef _SPU_H_
#define _SPU_H_
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#endif
thread_cancle.c文件
/*
1.创建两个线程,线程2传入线程1的线程id
2.线程的取消状态默认为 “响应”
3.线程的取消类型默认为 ”延时相应“
4.线程1中设置取消类型为 “立即相应”
5.在线程2中取消线程1
*/
#include "spu.h"
void *thread_fun1(void *arg)
{
//立即相应取消请求
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
for(int i = 0; i< 10; i++)
{
printf("thread01111 : %d\n", i);
sleep(1);
}
return (void*)0;
}
void *thread_fun2(void *arg)
{
for(int i = 10; i< 20; i++)
{
printf("thread02222 : %d\n", i);
sleep(2);
if(i == 12)
{
printf("取消线程1\n");
if( 0 == pthread_cancel((pthread_t)arg))
printf("取消线程1成功!\n");
}
}
return (void*)0;
}
int main(int argc, char *argv[])
{
int err1, err2;
pthread_t thread_id1,thread_id2;
void *__retval;
err1 = pthread_create(&thread_id1, NULL, thread_fun1, NULL);
err2 = pthread_create(&thread_id2, NULL, thread_fun2, (void*)thread_id1);
if(err1 || err2)
printf("create failed!\n");
else
printf("create success!\n");
pthread_exit(__retval);
}