未加星标

SylixOS中pthread_cancel函数浅析

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
1 知识简介 1.1 概述

取消一个线程要确保该线程能够释放其所持有的任何锁、分配的内存,使整个系统保持一致性。在很多复杂情况下要保证这种正确性是有一定困难的。

一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡。在这种情况下,被取消线程所持有的的资源得不到释放。取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现。这种取消称为不受限制的 异步取消 。

还存在另外一种更安全的线程取消机制。一个线程可以以可靠的受控制的方式向进程的其他线程发出取消请求,目标线程可以挂起这一请求使实际的取消动作在此后安全的时候进行,称为 延迟取消 。目标线程还可以定义其被取消后自动被系统调用的线程清除函数。

SylixOS 兼容绝大多数 POSIX 接口, SylixOS 中 pthread_cancel 函数执行线程取消功能。

pthread_cancel 函数和目标线程的取消动作是异步的。根据目标线程的取消属性不同,取消请求可能被忽略、立即执行或者延迟处理。为了清楚这些动作,下面知识点先简单介绍线程取消属性相关概念。

1.2 知识点

SylixOS 中 pthread_cancel 函数由 px_pthread.h 头文件定义,其原型为:

int pthread_cancel (pthread_tthread);

此函数成功返回 0 ,失败返回错误号;

参数 thread 是取消的线程句柄。

SylixOS 中用取消状态,取消类型和取消请求这 3 个元素共同表示一个线程的取消属性,其存在于线程控制块中。如表 2-1 所示。

表 2-1 取消说明

表示

说明

取消类型

允许取消

LW_THREAD_CANCEL_ENABLE

线程取消状态决定了指定线程是否可以被取消,取消状态分为允许取消和禁止取消,一个线程设置为允许取消意味着此线程可以被取消,禁止取消意味着此线程只能从自己返回或者调用 pthread_exit 函数来退出。

禁止取消

LW_THREAD_CANCEL_DISABLE

取消类型

异步取消

LW_THREAD_CANCEL_ASYNCHRONOUS

取消类型是线程取消的方式,分为异步取消和延迟取消,异步取消属性的线程会在收到取消信号时立即删除自身,也可说成立即取消,延迟取消属性的线程会在“安全”的时机调用线程删除函数删除自身。

延迟取消

LW_THREAD_CANCEL_DEFERRED

取消请求

在延迟取消类型中,取消请求为 1 表示取消请求被挂起,直到运行到下一个取消点才被执行

该取消请求仅在线程允许取消时可用

线程初始化时会有默认的取消属性,即线程保留 允许取消 和 延迟取消 的属性,保证收到取消信号时,线程接受该取消信号,不会屏蔽掉,并且会在自身安全的时候,调用线程删除函数,即延迟取消。另外一个线程的取消状态和取消类型可分别调用相关函数设置,如表 2-2 所示。函数均在 px_pthread.h 头文件中定义。

表 2-2 设置取消属性

函数

设置线程取消状态

int

pthread_setcancelstate

(int newstate , int * poldstate )

设置线程取消类型

int

pthread_setcanceltype

(int newtype , int * poldtype )

参数

参数 newstate 是新状态

输出参数 poldstate 返回之前的状态

参数 newtype 是新类型

输出参数 poldtype 返回之前的类型

返回值

此函数成功返回 0,失败返回错误号

此函数成功返回 0,失败返回非 0 值

前文提到,延迟请求会使线程的取消动作在安全的时候进行,那线程具体的取消时机是在什么时候呢?会涉及到“取消点”的概念,在后续章节中介绍。

2 技术实现 2.1 实现流程

SylixOS 中 pthread_cancel 函数实现机制,如图 3-1 所示


SylixOS中pthread_cancel函数浅析
图 3-1 pthread_cancel 函数实现流程 2.2 “取消点”概念

在使用延迟取消机制时,一个线程在可以被取消的地方定义取消点,当收到取消请求时,被取消的线程执行到取消点时退出,或者在一个取消点调用被阻塞时退出。

由于在延迟取消中必须在取消点才能被取消,这一限制可能使取消请求被挂起任意长时间。因此,如果某个调用可能使线程被阻塞或者进入某个较长时间的过程, POSIX 要求这些调用属于一个取消点,或者称这些调用为取消点调用,以防止取消请求陷入长时间等待, SylixOS 中存在一些拥有取消点的函数,如 open , read , pthread_join , printf 等,他们都直接或间接的调用了 pthread_testcancel 函数 pthread_testcancel 函数内部实现流程如图 3-2 所示。


SylixOS中pthread_cancel函数浅析

图 3-2 pthread_testcancel 函数实现流程

因此,被取消线程会在执行拥有取消点的函数时,进入到 pthread_testcancel 函数内部,进行如图 32 所示的允许取消、延迟取消以及取消请求标志的判断流程,倘若条件满足,被取消线程会在这里调用线程删除函数删除自身。

表 3-1 列出部分拥有取消点的函数以供参考。

表 3-1 拥有取消点的函数

函数名

函数名

函数名

sleep

send

open

system

sendmsg

close

wait

aio_suspend

read

waitid

mq_send

pread

waitpid

mq_receive

write

wait3

pthread_barrier_wait

pwrite

wait4

sem_wait

readv

reclaimchild

tcdrain

writev

accept4

fcntl

fsync

connect

creat

select

recv

sigtimedwait

pause

recvfrom

pthread_join

pthread_testcancel

3 示例演示

以下示例验证均在 SylixOS 环境下进行。

3.1 示例1:立即取消

如图 4-1 所示,子线程设置 立即取消 类型,那么主线程成功发送取消信号后,打印" pthread_cancel OK ",子线程会在下次执行开始处删除自身,退出时子线程 i 的值可能为 0~1000000 任意值。


SylixOS中pthread_cancel函数浅析

图 4-1 立即取消示例

3.2 示例2:延迟取消 如图 4-2 所示,子线程设置 延迟取消 类型,那么主线程执行取消线程函数后,打印“ pthread_cancel OK ”,子线程会在执行到 取消点 时删除自身, sleep 为拥有取消点的函

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: 删除
分页:12
转载请注明
本文标题:SylixOS中pthread_cancel函数浅析
本站链接:http://www.codesec.net/view/535133.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(36)