pthread_once导致死锁

news/2024/11/20 16:36:56/文章来源:https://www.cnblogs.com/yghr/p/18346200

在一个pthread_once方法内又再次调用了这个pthread_once导致死锁。

分析下这个pthread_once的源码:


可以看到这个pthread_once_t结构体就是一个整形数字加自旋锁。

int
___pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
{/* Fast path.  See __pthread_once_slow.  */int val;val = atomic_load_acquire (once_control);if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0)) // 这里判断如果已经执行完成就返回0return 0;elsereturn __pthread_once_slow (once_control, init_routine);
}
static int
__attribute__ ((noinline))
__pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void))
{while (1){int val, newval;/* CAS把状态改为__PTHREAD_ONCE_INPROGRESS *//* We need acquire memory order for this load because if the valuesignals that initialization has finished, we need to see anydata modifications done during initialization.  */val = atomic_load_acquire (once_control);do{/* Check if the initialization has already been done.  */if (__glibc_likely ((val & __PTHREAD_ONCE_DONE) != 0))return 0;/* We try to set the state to in-progress and having the currentfork generation.  We don't need atomic accesses for the forkgeneration because it's immutable in a particular process, andforked child processes start with a single thread that modifiedthe generation.  */newval = __fork_generation | __PTHREAD_ONCE_INPROGRESS;/* We need acquire memory order here for the same reason as for theload from once_control above.  */}while (__glibc_unlikely (!atomic_compare_exchange_weak_acquire (once_control, &val, newval)));/* Check if another thread already runs the initializer.	*/if ((val & __PTHREAD_ONCE_INPROGRESS) != 0){/* 修改失败,说明其他线程在修改,直接等待 *//* Check whether the initializer execution was interrupted by afork.  We know that for both values, __PTHREAD_ONCE_INPROGRESSis set and __PTHREAD_ONCE_DONE is not.  */if (val == newval){/* Same generation, some other thread was faster.  Wait andretry.  */futex_wait_simple ((unsigned int *) once_control,(unsigned int) newval, FUTEX_PRIVATE);continue;}}/* This thread is the first here.  Do the initialization.Register a cleanup handler so that in case the thread getsinterrupted the initialization can be restarted.  */pthread_cleanup_combined_push (clear_once_control, once_control);/* 调用用户传入的方法 */init_routine ();pthread_cleanup_combined_pop (0);/* Mark *once_control as having finished the initialization.  We needrelease memory order here because we need to synchronize with otherthreads that want to use the initialized data.  *//* 修改状态为__PTHREAD_ONCE_DONE */atomic_store_release (once_control, __PTHREAD_ONCE_DONE);/* Wake up all other threads.  *//* 唤醒其他线程 */futex_wake ((unsigned int *) once_control, INT_MAX, FUTEX_PRIVATE);break;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.3 功率电感选型----硬件设计指南(持续补充更新)

本系列文章是笔者总结多年工作经验,结合理论与实践进行整理备忘的笔记。希望能在帮助自己温习整理避免遗忘的同时,也能帮助其他需要参考的朋友。笔者会不定期进行查漏补缺。如有谬误,欢迎大家进行指正。 一、设计要点 1.电流降额建议按照1-10%-电感精度进行,主要设计参数是…

基于simulink的分布式发电系统自动重合闸的建模与仿真分析

1.课题概述在配电系统中,80%-90%的故障都是瞬时故障。发生故障时,线路被保护迅速断开,随即重合闸。当分布式电源接入配电网后,线路发生故障后重合闸,此时分布式电源没有跳离线路,这将产生两种潜在威胁,即非同期重合闸和故障点电弧重燃。非同期重合闸:当线路上发生故障,…

Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10

Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10 本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里 安装 pysqlcipher3 这里用 32位 举例 因为 64位 安装完全相同,只需要把对…

17 模块subprocess、re

1. subprocess模块 1.1 概念subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值 简单理解:可以远程连接电脑(socket模块) 1.2 Popen方法import subprocessres = subprocess.Popen([help, ver], # windows中执行的命令要放在列表里面,命令单…

STM32学习记录(八):DMA

什么是DMA? DMA在之前的学习中已经用过了。那么,什么是DMA?Direct memory access (DMA) is used in order to provide high-speed data transfer between peripherals and memory as well as memory to memory. Data can be quickly moved by DMA without any CPU actions…

CTF—Misc基础

一:文件操作与隐写 1、文件类型的识别 1、文件头完好情况: (1)file命令 使用file命令识别:识别出file.doc为jpg类型(2)winhex 通过winhex工具查看文件头类型,根据文件头部内容去判断文件的类型eg:JPG类型(3)notepad++ 下载HEXeditor插件,查看文件的头部信息,和010e…

位运算符

1.与(&)2.或(|)3.亦或(^)4.非(~)5.关于位运算的面试题 问:如何用电脑将2乘8最快算出?6.左移 右移的底层原理

雷达气象学(7)——反射率因子图分析(气象回波篇)

从本篇文章开始介绍反射率因子图(即雷达回波强度图)的分析与识别方法。 目录7.0 雷达回波的分类7.1 层状云降水回波7.2 积状云降水回波(对流性降水回波)7.3 层积混合降水回波7.4 零度层亮带7.5 晴空回波 7.0 雷达回波的分类 雷达回波可分为气象回波和非气象回波: \[雷达回…

(Jmeter新玩法)Python 调 Jmeter执行参数化jmx脚本

# Python 调 Jmeter执行参数化jmx脚本import os from os.path import join import time import re from string import Templatejmeter_Home = r"F:\softtotal\xxx\bin\jmeter.bat"# jmx文件路径 currpath = os.path.dirname(os.path.realpath(__file__)) # 要运行的…

超快速的百度网盘不限速下载技巧,建议偷偷使用!

小伙伴们,你们是否曾经为百度迅雷网盘限速而烦恼呢?动不动就要冲svip会员,不仅费钱,开通后还慢的气死,我现在来介绍一种全新的高效下载方法吧,只需要下载并安装一款神奇的软件,接着简单操作即可轻松实现快速下载,节省时间,这款神奇的软件具体信息在文章最后有说明。 第…