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;

}

相关文章
|
1月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
64 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
1月前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
146 0
|
3月前
|
调度
多线程学习笔记
这篇文章是多线程学习笔记,涵盖了线程与进程的概念、多线程实现方式、线程状态、线程同步与不安全示例、死锁问题以及生产者与消费者问题等多线程编程的关键知识点。
多线程学习笔记
|
6月前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
55 3
|
6月前
|
安全 Java 编译器
多线程 (下) - 学习笔记2
多线程 (下) - 学习笔记
45 1
|
6月前
|
存储 算法 Java
多线程 (下) - 学习笔记1
多线程 (下) - 学习笔记
47 1
|
6月前
|
设计模式 安全 NoSQL
多线程 (上) - 学习笔记2
多线程 (上) - 学习笔记
45 1
|
6月前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
68 4
|
6月前
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
30 1
|
6月前
|
Java API 调度
多线程 (上) - 学习笔记1
多线程 (上) - 学习笔记
38 0