多线程-Cancel详解

在取消一个对等线程的请求被同意时,会有一个取消过程同pthread_cancel( )的返回异步发生。

目标线程的取消类型和取消状态决定了取消何时真正发生。可取消性状态描述了线程的取消状况为可取消或不可取消。

线程的可取消性类型决定了线程在收到取消请求后继续执行的能力。可取消性状态和类型是由线程自己动态设置的。

调用线程的可取消性状态和类型是由pthread_setcancelstate( )和pthread_setcanceltype( )设置的。

pthread_setcancelstate( )将调用线程设置为state所指定的可取消性状态,并将之前的状态在oldstate中返回。

pthread_setcanceltype( ) 将调用线程设置为type所指定的可取消性类型,并将之前的类型在oldtype中返回。

调用形式

#include <pthread.h> int pthread_setcancelstate(int state, int *oldstate);

int pthread_setcanceltype(int type, int *oldtype);

用于设置线程取消状态的state和oldstate的值是:

PTHREAD_CANCEL_DISABLE

PTHREAD_CANCEL_ENABLE

PTHREAD_CANCEL_DISABLE使得线程忽略取消请求。

PTHREAD_CANCEL_ENABLE使得线程允许取消请求。

PTHREAD_CANCEL_ENABLE是任何新近创建的线程的默认状态。

如果成功,函数返回0。如果没有成功,函数返回一个错误号。

如果没有传递有效的state值,则pthread_setcancelstate( )会失败。

函数pthread_setcanceltype( )将调用线程的可取消性状态设置为type指定的类型,并将之前的状态通过oldtype返回。

type和oldtype的值可以为:

PTHREAD_CANCEL_DEFFERED

PTHREAD_CANCEL_ASYNCHRONOUS

PTHREAD_CANCEL_DEFFERED使得线程推迟终止,

直到它到达它的取消点。这是任何新近创建的线程的默认可取消性类型。

PTHREAD_CANCEL_ASYNCHRONOUS使得线程立即终止。

如果成功,函数返回0。如果不成功,函数返回一个错误号。

如果没有传递有效的type,则pthread_setcanceltype( )会失败。

pthread_setcancelstate ( )和pthread_setcanceltype( )共同使用来建立线程的可取消性。

时间: 2024-08-18 11:34:20

多线程-Cancel详解的相关文章

多线程分离-详解

多线程分离-详解 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached). 一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的. 相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己.在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束. 只有当pthread_join()函数返回时,创建的线程才算终止

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

Swift - 多线程GCD详解

//  GCD详解 //  目录: //  1. 创建GCD队列(最常用) //  2. 自定义创建队列 //  3. 使用多线程实现延迟加载 //  4. 使用多线程实现重复(循环) //  5. 使用多线程来控制 多任务数据加载 和 UI 的显示的先后顺序 //  6. 暂停队列 //  7. 恢复队列 // import UIKit class ViewController: UIViewController { @IBOutlet var myLable:UILabel? @IBActi

mysql5.6 基于GTID及多线程复制详解

一 GTID 详解 官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id MySQL 5.6 中,每一个 GTID 代表一个数据库事务.在上面的定义中,source_id 表示执行事务的主库 uuid(server_uuid),transaction_id 是一个从 1 开始的自增计数,表示在这个主库

C++11多线程——lock详解

C++11提供了两种管理锁的类 std::lock_guard:与mutex RAII相关,方便线程对互斥量上锁 std::unique_lock:   与mutex RAII相关,方便线程对互斥量上锁,相比std::lock_guard提供了更好的上锁和解锁控制 一 lock_guard详解 lock_guard是一个模板类:template<classMutex>class lock_guard; lock_guard对象通常用来管理某个锁(Lock)对象,与Mutex RALL相关,方便

Python多线程编程详解

Threading模块从Python 1.5.2 版开始出现,用于增强底层的多线程模块 thread .Threading 模块让操作多线程变得更简单,并且支持程序同时运行多个操作. 注意, Python开发中的多线程最好用于处理有关 I/O 的操作 ,如从网上下载资源或者从本地读取文件或者目录.如果你要做的是 CPU 密集型操作,那么你需要使用 Python 的 multiprocessing 模块.这样做的原因是,Python 有一个全局解释器锁 (GIL),使得所有子线程都必须运行在同一个

Android 多线程-----AsyncTask详解

本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行.默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程.当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的.当然

IOS 多线程04-GCD详解 底层并发 API

注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大量的复杂度和更多的责任.在我们的文章常见的后台实践中提到的高层的 API 和模式能够让你专注于手头的任务并且免于大量的问题.通常来说,高层的 API 会提供更好的性能,除非你能承受起使用底层 API 带来的纠结于调试代码的时间和努力. 尽管如此,了解深层次下的软件堆栈工作原理还是有很有帮助的.我们希望这篇文章能够让你更好的了解这个平台,同时,让你更

Linux多线程编程详解 [By: HarryAlex]

本文内容主要参考于<Linux程序设计·第3版>.<Linux环境C程序设计>.<C语言核心技术>.<深入理解计算机系统·第2版>,代码运行环境: Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Jun 4 17:17:49 CST 2015 1. Linux进程与