关于pthread_rwlock_t读写锁产生死锁的情况

2023-10-28

对于pthread_rwlock_t读写锁:
一个线程持有着写锁,又去加(该锁的)读锁,可能会产生死锁。
一个线程持有着(读或者写)锁,又去加(该锁的)写锁,可能会产生死锁。
此时pthread_rwlock_rdlock和pthread_rwlock_wrlock会返回EDEADLK,加锁失败。

pthread_rwlock_rdlock:If a writer holds the lock, the calling thread shall not acquire the read lock. The calling thread may deadlock if at the time the call is made it holds a write lock.

pthread_rwlock_wrlock:The calling thread may deadlock if at the time the call is made it holds the read-write lock (whether a read or write lock).

另外pthread_rwlock_rdlock还可能返回EAGAIN,意为读锁已达上限。除此之外,两个函数不会返回其他错误了。

如果不检查pthread_rwlock_rdlock和pthread_rwlock_wrlock的返回值,就认为返回后就拿到了锁,会产生未定义后果,比如:

printf("EDEADLK is %d\n", EDEADLK);
printf("EAGAIN is %d\n", EAGAIN);

int ret = 0;
pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
ret = pthread_rwlock_wrlock(&lock);
printf("wrlock return value is %d\n", ret);
ret = pthread_rwlock_rdlock(&lock); //加锁失败!
printf("rdlock return value is %d\n", ret);
pthread_rwlock_unlock(&lock);
pthread_rwlock_unlock(&lock); //本线程未加锁却解锁会产生未定义后果

ret = pthread_rwlock_rdlock(&lock);
printf("rdlock return value is %d\n", ret);
pthread_rwlock_unlock(&lock);

这段代码看着可能很傻,但如果将写锁和读锁放到两个函数里,一个函数调用另一个函数,就比较容易发生了。
所以加锁的时候要判断下返回值,如果是EDEADLK,可以直接终止程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于pthread_rwlock_t读写锁产生死锁的情况 的相关文章

随机推荐

  • 编写函数,计算传入函数的字符串中,数字、字母、空格以及其他内容的个数,并返回

    初学python函数 简单编写一个计算字符串的例子 代码如下 s input 请输入一个字符串 def fun1 s shuzi zimu kongge qita 0 for i in range len s if s i gt a and
  • 关于Android的自动化测试,你需要了解的5个测试框架

    Appium Appium是一个开源的移动测试工具 支持iOS和Android 它可以用来测试任何类型的移动应用 原生 网络和混合 作为一个跨平台的工具 你可以在不同的平台上运行相同的测试 为了实现跨平台的功能 Appium使用了供应商提供
  • 无法启动 nexus 服务,错误1067:进程意外终止。java环境变量设置技巧。

    Nexus启动失败 wrapper log记载 无支持版本 51 0 版本51 0指的是Java1 7 分析 nexus版本为2 14 8 适用JRE版本为1 7 已配置JAVA HOME为1 7版 cmd中 java version 显示
  • 【ASE学习笔记】_02_溶解

    Shader类型 实现效果 最终结点 思路 通过控制图片的不透明度来实现图片的展示或消失 再通过去控制不透明度的形状让其无规则的呈现 这里利用噪声图 1 设置一个DIss系数用于控制噪声图的显示 通过Step函数 B gt A的部分会被显示
  • 详解nuitka打包

    安装和说明 说明 为什么学习nuitka 一个字 小 使用nuitka打包的exe体积明显要比pyinstaller小很多 且启动速度要快个30 左右 本着速度即是正义 因此没有特殊需求过短抛弃pyinstaller拥抱nuitka 安装和
  • Qt为工具栏按钮QToolButton添加下拉菜单

    效果如下 主要代码如下 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this createToolBu
  • Maven云笔记之登录注册

    Maven云笔记注册登录篇 使用MVC框架开始编写一个笔记本应用 目录结构 登录界面
  • 关于智能车独轮组编码器的思考

    独轮车模到货了 计划使用更优雅更便宜的霍尔编码器而不用常规的机械编码器 所以立刻对霍尔编码器可行性进行了评估 O车模减速电机出轴特写 减速电机大概就是加了减速齿轮组的RS380 是标准尺寸电机 所以配套的编码器市面上肯定有卖 淘宝稍稍一翻便
  • 前后端分离项目简单实现增删改查

    大家好 我是梦想皮皮 今天带来一篇关于springboot vue MySQL项目的粗浅的介绍 同时也用到了vue element也集成了mybatis希望能帮助到大家 该项目使用到springboot vue MySQL mybatis同
  • 如何读懂期权希腊字母、隐含波动率、理论价格等?

    如何读懂期权希腊字母 隐含波动率 理论价格等 每一个希腊值都是用来度量期权头寸的某种特定风险 投资者可以通过管理这些希腊值 以 便将风险保持在一个可以接受的范围之内 Delta 期权价格变化同标的价格变化之间的比率 看涨期权的 Delta
  • r连接db2 no license is present_R语言基础 期中考试

    一 单选题 题数 20 共 40 0 分 1下列用来转换数据框的函数是 2 0分 2 0 分A as listB as matrixC as data frameD as vector我的答案 C2以下函数不能直接查看plot函数的帮助文档
  • 检测CPU是否具备VT的功能,并开启

    1 cpuid 指令 EFLAGS寄存器中的ID标志 位21 表示对CPUID指令的支持 如果一个软件程序可以设置和清除这个标志 那么执行该程序的处理器支持CPUID指令 这条指令在非64位模式和64位模式下操作相同 CPUID在EAX E
  • 华为手机计算机代码大全,华为手机指令代码大全,你想要了解的功能都在这里!...

    原标题 华为手机指令代码大全 你想要了解的功能都在这里 昨天写了vivo手机的指令代码 有部分朋友说不够详细 以及不懂这些是干嘛的 其实 你按照文中去操作一遍就能知道这些指令的功能了啊 今天来说说华为 华为手机大部分手机都采用的是安卓系统
  • Vue.js 学习笔记十六:Axios 之 Axios 封装

    目录 Axios 封装 Axios 封装 src plugins http js import axios from axios import router from router import store from store impor
  • Unity在运行时使用FBX SDK的API

    1 写在前面 本文主要一块学习关于Unity官方封装的AutoDesk的FBX SDK的API的C 版本包 最初该包的本意是想让开发者在编辑器模式下使用 但是官方也提供了在运行时对于该包的支持 2 获取Autodesk FBX SDK fo
  • 竞赛 基于机器视觉的手势检测和识别算法

    0 前言 优质竞赛项目系列 今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 更多资料 项目分享 https gitee com dancheng senior postgraduate
  • LeetCode:228(Python)—— 汇总区间(简单)

    汇总区间 概述 给定一个无重复元素的有序整数数组 nums 返回恰好覆盖数组中所有数字的最小有序区间范围列表 也就是说 nums 的每个元素都恰好被某个区间范围所覆盖 并且不存在属于某个范围但不属于 nums 的数字 x 输入 nums 0
  • js逆向补环境示例代码1

    在官方文档 内置对象中的object下很多属性都可以用来检测环境 Object JavaScript MDN 拿Object getOwnPropertyDescriptor 来做示例笔记 在文档中它的说明 Object getOwnPro
  • matlab erf erfi,误差函数

    误差函数 在数学中 误差函数 也称之为高斯误差函数 是一个特殊函数 即不是初等函数 其在概率论 统计学以及偏微分方程中都有广泛的应用 它的定义如下 erf x 1 x x e t 2 d t 2 0 x e t 2 d t displays
  • 关于pthread_rwlock_t读写锁产生死锁的情况

    对于pthread rwlock t读写锁 一个线程持有着写锁 又去加 该锁的 读锁 可能会产生死锁 一个线程持有着 读或者写 锁 又去加 该锁的 写锁 可能会产生死锁 此时pthread rwlock rdlock和pthread rwl