如何进行基于linuxthreads2.0.1线程源码分析cancel.c
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这期内容当中小编将会给大家带来有关如何进行基于linuxthreads2.0.1线程源码分析cancel.c,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。cance
千家信息网最后更新 2025年12月03日如何进行基于linuxthreads2.0.1线程源码分析cancel.c
这期内容当中小编将会给大家带来有关如何进行基于linuxthreads2.0.1线程源码分析cancel.c,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
cancel.c实现了线程的是否可取消,取消类型,取消线程,设置线程退出时需要执行的函数列表等功能。
/* Thread cancellation */
#include
#include "pthread.h"
#include "internals.h"
#include "restart.h"
/*
修改线程的可取消属性。有一个取消点
取消状态分为可取消,不可取消
不可取消的时候,收到取消信号,忽略
可取消的时候,收到取消信号的时候,根据取消类型做处理。
立即处理
不立刻处理,到下一个取消点,判定线程的状态的取消类型再处理
*/
int pthread_setcancelstate(int state, int * oldstate)
{
pthread_t self = thread_self();
if (state < PTHREAD_CANCEL_ENABLE || state > PTHREAD_CANCEL_DISABLE)
return EINVAL;
// 保存旧的状态
if (oldstate != NULL) *oldstate = self->p_cancelstate;
// 设置新的状态
self->p_cancelstate = state;
// 判断线程是否被取消了,并且当前被设置成可取消状态,并且是需要马上处理的,则直接退出
if (self->p_canceled &&
self->p_cancelstate == PTHREAD_CANCEL_ENABLE &&
self->p_canceltype == PTHREAD_CANCEL_ASYNCHRONOUS)
pthread_exit(PTHREAD_CANCELED);
return 0;
}
// 见上一个函数
int pthread_setcanceltype(int type, int * oldtype)
{
pthread_t self = thread_self();
if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS)
return EINVAL;
if (oldtype != NULL) *oldtype = self->p_canceltype;
self->p_canceltype = type;
if (self->p_canceled &&
self->p_cancelstate == PTHREAD_CANCEL_ENABLE &&
self->p_canceltype == PTHREAD_CANCEL_ASYNCHRONOUS)
pthread_exit(PTHREAD_CANCELED);
return 0;
}
// 给线程发送取消请求,线程收到该信号是否处理,怎么处理取决于线程本身对于取消的相关配置
int pthread_cancel(pthread_t thread)
{
thread->p_canceled = 1;
kill(thread->p_pid, PTHREAD_SIG_CANCEL);
return 0;
}
// 设置一个取消点
void pthread_testcancel(void)
{
pthread_t self = thread_self();
// 判断线程是不是已经被取消,并且是可取消的,则退出
if (self->p_canceled && self->p_cancelstate == PTHREAD_CANCEL_ENABLE)
pthread_exit(PTHREAD_CANCELED);
}
// 链表中新增一个clean函数
void _pthread_cleanup_push(struct _pthread_cleanup_buffer * buffer,
void (*routine)(void *), void * arg)
{
pthread_t self = thread_self();
buffer->routine = routine;
buffer->arg = arg;
// 头插法
buffer->prev = self->p_cleanup;
self->p_cleanup = buffer;
}
// 删除一个clean节点,execute判断是否需要执行
void _pthread_cleanup_pop(struct _pthread_cleanup_buffer * buffer,
int execute)
{
pthread_t self = thread_self();
if (execute) buffer->routine(buffer->arg);
self->p_cleanup = buffer->prev;
}
// 新增一个clean节点,保存旧的取消类型,设置新的取消类型为PTHREAD_CANCEL_DEFERRED
void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer * buffer,
void (*routine)(void *), void * arg)
{
pthread_t self = thread_self();
buffer->routine = routine;
buffer->arg = arg;
buffer->canceltype = self->p_canceltype;
buffer->prev = self->p_cleanup;
self->p_canceltype = PTHREAD_CANCEL_DEFERRED;
self->p_cleanup = buffer;
}
// 和上面的函数配套。删除一个clean节点,execute控制是否需要执行删除的这个节点,恢复线程的取消类型,是一个有取消点的函数
void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer * buffer,
int execute)
{
pthread_t self = thread_self();
if (execute) buffer->routine(buffer->arg);
self->p_cleanup = buffer->prev;
self->p_canceltype = buffer->canceltype;
if (self->p_canceled &&
self->p_cancelstate == PTHREAD_CANCEL_ENABLE &&
self->p_canceltype == PTHREAD_CANCEL_ASYNCHRONOUS)
pthread_exit(PTHREAD_CANCELED);
}
// 线程退出的时候(pthread_exit)调用执行clean链表的节点
void __pthread_perform_cleanup(void)
{
pthread_t self = thread_self();
struct _pthread_cleanup_buffer * c;
for (c = self->p_cleanup; c != NULL; c = c->prev) c->routine(c->arg);
}
#ifndef PIC
/* We need a hook to force the cancelation wrappers to be linked in when
static libpthread is used. */
extern const int __pthread_provide_wrappers;
static const int * const __pthread_require_wrappers =
&__pthread_provide_wrappers;
#endif
上述就是小编为大家分享的如何进行基于linuxthreads2.0.1线程源码分析cancel.c了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
线程
处理
类型
函数
状态
节点
分析
时候
信号
源码
内容
专业
中小
内容丰富
功能
取决于
就是
属性
文章
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机网络技术尔雅课
软件开发岗位笔试范围
广西牛犇互联网科技有限公司
互联港湾网络技术外包
数据库 学生学籍管理系统
人事档案管理软件开发
服务器管理器开机显示
个人用户网络安全防范措施
网络技术员的职业类型
华为429网络安全日
软件开发单招面试自我介绍
服务器能装成电脑
学校软件开发及存储管理合同
广耀网络技术有限公司怎么样
武汉企业管理软件开发
长宁区创新网络技术包括什么
网络安全云展览观后感30字
数据库的技术与应用
憨猴科技与互联网行业
一般一个软件开发需要多少钱
网络技术服务可以开推广费吗
可以做白银交易的软件开发
网络安全做的是什么
导出icloud数据库
idc 软件开发
怎样查看sql数据库项目名称
ps5连接服务器不见了
网络安全手绘素材
tcu软件开发工程师
python 服务器搭建