Pthread_cancel 线程取消|学习笔记

简介: 快速学习 Pthread_cancel 线程取消

开发者学堂课程【物联网开发- 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_DISABLE为不允许取消,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;

}

相关文章
|
2天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
44 0
|
2天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
19 4
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
|
2天前
|
Java C++
多线程学习笔记(二)
1. 子线程先执行:启动子线程后立即调用`join()`,主线程会等待子线程完成。 `suspend()`方法。 3. `synchronized` vs `Lock`:前者是关键字,后者是接口;前者可用在代码块和方法,后者在代码中显式;前者自动释放锁,后者需`finally`释放;前者无超时/中断控制,后者可设定;前者非公平,后者可公平/不公平,且支持读写锁。 4. `synchronized`底层实现:基于 Monitor 模型,JVM层面的锁定机制,通过 monitors 和 monitorenter/monitorexit 指令实现。
|
2天前
|
Java Linux API
Linux C/C++ 开发(学习笔记五):线程池
Linux C/C++ 开发(学习笔记五):线程池
24 0
|
2天前
|
安全 Linux 调度
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
45 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
68 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置
|
7月前
|
NoSQL 网络协议 Redis
Redis学习笔记-高性能IO模型&Redis6.0多线程
Redis学习笔记-高性能IO模型&Redis6.0多线程
81 0
|
7月前
|
存储 安全 Linux
Go语言学习笔记-进程和线程
Go语言学习笔记-进程和线程
39 0
Go语言学习笔记-进程和线程
|
9月前
|
Linux
计算机操作系统学习笔记(6)——进程和线程
计算机操作系统学习笔记(6)——进程和线程
54 0