开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Pthread_cancel 线程取消】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11069
Pthread_cancel 线程取消
内容介绍:
一、有关线程的相关定义
二、线程的取消状态
一、有关线程的相关定义
1.线程取消定义
在同一个进程中,两个线程可以互相取消。 pthread cancel 函数的实质是发信号给目标线程 thread 。使目标线程退出。即线程取消的原理就是发信号。
此函数只是发送终止信号给目标线程,不会等待取消目标线程执行完才返回。然而发送成功并不意味着目标线程一定就会终止,线程被取消时,线程的取消属性会决定线程能否被取消以及何时被取消。
2.线程的取消状态
即线程能不能被取消,可以在线程中设置。
3.线程取消点(线程可以被取消的前提下才存在)
即线程被取消的地方
4.线程的取消类型
是立马被取消结束还是执行到取消点的时候被取消结束
二、线程的取消状态
即线程能不能被取消
在 Linux 系统下,线程默认可以被取消。编程时可以通过 pthread setcancelstate 函数设置线程是否可以被取消
pthread setcancelstate设置取消状态 (int state,int * old_state);其中
state:
是现在的的状态;
PTHREAD_CANCEL_DISABLE :不可以被取消
PTHREAD_CANCEL_ENABLE :可以被取消。
old _state :
保持了以前的取消状态,即保存调用线程原来的可取消状态的内存地址。
pthread cancel 函数很简单,其后加目标线程的线程号就可以。
例:05 pthread setcancelstatec 验证设置线程能\否被取消,然后看线程能不能被取消
在 main 函数中创建一个线程,在线程里设置取消状态,循环,等待线程取消。 main 函数为主线程,主线程创建完线程一之后 sleep 3秒,3秒钟之后取消线程一,等待线程一结束之后回收线程资源,程序结束。
如果线程取消不了,程序就会一直在join上循环。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *thread_cancel(void *arg)
{
//pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);PTHREAD_CANCEL_ENABLE
为允许取消,3秒后主线程取消程序
//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);PTHREAD_CANCEL_DISAB
LE为不允许取消,3秒后主线程取消不了程序,程序就会一直在 join 上循环,线程不会结束,这个 cancel 线程就是失败的。
此程序是验证当前线程允不允许被取消的。
经验证,如果没有设置是否允许取消,默认是允许线程取消的
while(1) 设置线程取消状态
{
Printf(“this is my new thread_cancel\n”);
Sleep(1);
}
return NULL;
}
Int main(int argc, char *argv[] )
{
pthread_t tid1;
int ret =0:
pthread_create(&tid1,NULL,thread_cancel,NULL)
;在函数中创建一个线程
if(ret!=0)
perror(“pthread_create”);
sleep(3);
三秒钟之后
pthread_cancel(tid1);
主线程去取消线程1
pthread_join(tid1,NULL)
;如果取消不了就一直在join上循环
return 0;
}