pthread_cancel 相关

假设线程A对线程B发出了一个取消请求。通过如下函数:

#include <pthread.h>
int pthread_cancel(pthread_t thread); 

参数:
thread - 收到取消请求的线程id 

返回值:
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

 线程B如何反应呢?

这取决线程的两个状态属性,它们决定了该线程收到取消请求时的行为,下面给出这两个字段的意义和用法。

(1)线程的cancelability state

字段可以取值为:enabled (默认) or disabled。当取值为enabled,由cancelability type属性决定线程的行为。当取值为disabled,线程不可被取消,但取消请求还是会被接受。

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

参数:
state - 设置线程的取消state,可以取如下值
PTHREAD_CANCEL_ENABLE(默认取值)
PTHREAD_CANCEL_DISABLE

oldstate - 用作保存线程之前的取消state

(2)线程的cancelability type

#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);

参数:
type - 取值如下
PTHREAD_CANCEL_DEFERRED(默认取值)
取消请求会被推迟到调用一个是cancellation point的函数,参看http://man7.org/linux/man-pages/man7/pthreads.7.html

PTHREAD_CANCEL_ASYNCHRONOUS线程可以在任何时候被取消。(通常,线程只要接收到取消请求,便会直接被取消。但是系统不保证这一点)。

oldtype - 保存旧的type

一个例子

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

void wait() {
        for(int i = 0; i < 10000; i++){
                for (int j = 0; j < 1000; j++){
                        int k = 4;
                }
        }
}

void* PrintHello(void* threadid) {
        wait();//延时,等待足够时间以至于能够使得这个线程接收到取消请求。不用sleep函数是因为,这里需要测试pthread_testcancel函数是否是取消点,然而sleep也是取消点

        pthread_testcancel();//

        printf("hi\n"); //这一行不会被打印

        pthread_exit(NULL);
}

int main(){
        pthread_t tid;
        pthread_create(&tid, NULL, PrintHello, NULL);
        pthread_cancel(tid);//对tid对应的线程发送一个取消请求

        pthread_exit(NULL);
        return 0;
}

1.需要的头文件

#include <pthread.h>

2.编译指令

gcc main.c -lpthread

3.相关概念

http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html

时间: 2024-10-18 01:36:29

pthread_cancel 相关的相关文章

使用 pthread_cancel 引入的死锁问题

先来说一下 pthread_cancel 基本概念. pthread_cancel 调用并不是强制终止线程,它只提出请求.线程如何处理 cancel 信号则由目标线程自己决定,可以是忽略.可以是立即终止.或者继续运行至 Cancelation-point(取消点),由不同的 Cancelation 状态决定. 有几个与 pthread_cancel  相关的函数也要提及一下: int pthread_setcancelstate(int state, int *oldstate) 设置本线程对

SylixOS中pthread_cancel函数浅析

1 知识简介 1.1 概述 取消一个线程要确保该线程能够释放其所持有的任何锁.分配的内存,使整个系统保持一致性.在很多复杂情况下要保证这种正确性是有一定困难的. 一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡.在这种情况下,被取消线程所持有的的资源得不到释放.取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现.这种取消称为不受限制的异步取消. 还存在另外一种更安全的线程取消机制.一个线程可以以可靠的受控制的方式向进程的其他线程

(转载)Linux 线程取消(Pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

线程取消 (pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

APUE: 线程相关库函数

线程有时称为轻权进程. 进程的所有信息对该进程的所有线程都是共享的. 每个线程有一个线程ID,线程ID只在它所属的进程环境中有效. 线程从进程继承的东西: 进程ID 地址空间 浮点环境 信号屏蔽字(不包括未决的信号集) 线程间共享的东西: 进程指令 大部分数据 信号处理程序和信号处理 当前工作目录 用户ID和组ID 线程间独立的东西: 线程ID 寄存器集合 栈 errno 信号掩码 优先级 所有线程函数返回类型为int的成功返回0,失败返回错误码,不设置errno. 线程编程需要链接库: -lp

【Windows10&nbsp;IoT开发系列】PowerShell的相关配置

原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计. 1.​启动 PowerShell (PS) 会话 注:若要使用装有Windows10 IoT Core设备启动PS会话,首先需要在主机电脑与设备之间创建信任关系. ​启动 Windows IoT 核心版设备后,与该设备相连的

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

Android studio界面相关设置

Android studio界面相关设置 原文出自 http://www.cnblogs.com/justinzhang/p/4274839.html 用惯了emacs的操作方式,每当使用一款新的编辑器的时候,第一个想到的就是这个工具有没有emacs的快捷键,Android studio也是一样的. 1. Android studio设置emacs的方式如下,点击File->Settings 选择其中的keymap,在keymap中选择emacs,这样就成功的设置好了emacs的操作模式: 2.

25个Linux相关的网站【转】

转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章<Linux Distribution Timeline> 1. Linux.org 这个站点主要提供Linux相关的新闻.文档.教程,培训,以及其它一切和Linux相关的东西.这是你需要了解Linux开源