活锁方案与自旋锁

问题

如何设置获取互斥量时的等待时间?
如果等待超时,如何避免死锁?

避免死锁 -- 设置等待超时

解决方案:

1、尝试获取第 1 个互斥量:

  • 若成功,则转 2 执行;若失败,则等待;

2、尝试在规定时间内获取第 2 个互斥量:

  • 若成功,则执行临界区代码
  • 若失败,则释放第 1 个互斥量,休眠后转 1 执行

互斥量获取超时 API 函数

"活锁" 解决方案实现

思考

线程获取互斥量失败后究竟发生了什么?

Linux 中的自旋锁

自旋锁也是一种用于保证临界区的原子性的机制

自旋锁与互斥量类似,在任何时刻,最多只能有一个持有者

自旋锁与互斥量在内部机制上不同:

  • 互斥量:
    • 如果已经被其他线程持有,则当前线程进入等待状态 (不占用处理器,进入等待队列)
  • 自旋锁:
    • 如果已经被其他线程持有,则当前线程一直循环查看自旋锁是否再次可持有

互斥量 vs 自旋锁

应用场景

  • 互斥量是一种普适的解决方案,通用性强,副作用小
  • 自旋锁是一种特定场景下的解决方案,通用性弱,副作用大

实现机制

  • 互斥量涉及线程上下文切换,因此在效率上存在不足 (消耗时间资源)
  • 线程一直尝试获取自旋锁,因此不会进入阻塞状态 (消耗处理器资源)

Linux 中的自旋锁 API 函数

自旋锁类型:

  • PTHREAD_PROCESS_PRIVATE => 进程内自旋锁 (同一进程中的线程可用)
  • PTHREAD_PROCESS_SHARED => 进程间自旋锁 (任意进程的任意线程可用)

下面的多线程程序有问题吗?

自旋锁使用细则

轻量级锁定,即:临界区相对短小,自旋锁持有时间非常短

同一线程不可重复获取自旋锁 (导致死锁)

如果只有一个单核处理器,不建议使用自旋锁

线程一旦获取自旋锁,则不能让出处理器使用权

即:线程 获取锁 到 释放锁 的时间内只有一个执行流

有没有一种可能

存在一种 "锁" 类型:

  • 效率高 => 不会轻易发生上下文切换,使得线程进入阻塞状态
  • 无死锁 => 不会无限制自旋,适合的时间让出处理器使用权

关于 PTHREAD_MUTEX_ADAPTIVE_NP 类型

一种特殊的互斥量,又名:自适应锁

自适应锁先以自旋的方式持续尝试获取目标锁

当超时未能获取目标锁,则让出处理器使用权,线程进入阻塞状态

自适应锁相对普通互斥量效率更高,相对自旋锁安全性更好

下面的多线程程序有问题吗?

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

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

相关文章

部署tomcat

1 idea打包完&#xff0c;找到target目录下的网站 我的叫做 test.webSYS 2 linux 安装 tomcat 后 修改conf下的server.xml中的Connector的port <Connector port"9001" protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443…

深度学习缝模块怎么描述创新点?(附写作模板+涨点论文)

深度学习缝了别的模块怎么描述创新点、怎么讲故事写成一篇优质论文&#xff1f; 简单框架&#xff1a;描述自己这个领域&#xff0c;该领域出现了什么问题&#xff0c;你用了什么方法解决&#xff0c;你的方法有了多大的性能提升。 其中&#xff0c;重点讲清楚这两点&#xf…

关于node.js奇数版本不稳定 将11.x.x升级至16.x.x不成功的一系列问题(一)

据说vue2用16稳定一些 vue3用18好一点&#xff08;但之前我vue3用的16.18.1也可以&#xff09; 为维护之前的老项目 先搞定node版本切换 下载nvm node版本管理工具 https://github.com/coreybutler/nvm-windows/releases 用这个nvm-setup.zip安装包 安之前最好先将之前的nod…

问题:下列关于海关统计项目的表述,正确的有:A.进出境货物的统计重量和数量应以报关单位申报的重量和数 #笔记#职场发展#媒体

问题&#xff1a;下列关于海关统计项目的表述&#xff0c;正确的有&#xff1a;A&#xff0e;进出境货物的统计重量和数量应以报关单位申报的重量和数 下列关于海关统计项目的表述&#xff0c;正确的有&#xff1a; A&#xff0e;进出境货物的统计重量和数量应以报关单位申报的…

护眼台灯对眼睛有伤害吗?推荐适合考研使用的台灯

随着科技的进步&#xff0c;台灯的外观和造型都在不断发展&#xff0c;逐渐台灯的功能也多元化&#xff0c;各式各样的台灯都有&#xff0c;其中最受广大家长、学生党、办公族喜爱的就是护眼台灯。不过也有些小伙伴问&#xff0c;护眼台灯对眼睛有伤害吗&#xff1f; 其实正确的…

Linux虚拟文件系统(VFS)

虚拟地址空间通常是与进程密切相关的概念&#xff0c;而不是文件系统。虚拟地址空间是为了提供进程对内存的抽象和隔离而设计的。 文件系统不使用页表&#xff0c;直接使用物理地址。 虚拟文件系统是linux内核的一个核心子系统。、 虚拟文件系统的目的&#xff1a;通过一个抽…

2024年2月CCF-全国精英算法大赛题目

第一次参加这种比赛&#xff0c;虽然是c类赛事&#xff0c;但是是ccf主办的&#xff0c;难度还是有点的&#xff0c;主要是前面签到题主要是思想&#xff0c;后面的题目难度太高&#xff0c;身为力扣只刷了一百多道题目的我解决不了&#xff0c;这几道我只做了B,C题,E题超时了&…

Linux 命令基础

Shell概述 Linux操作系统的Shell作为操作系统的外壳&#xff0c;为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 Shell是用户和Linux内核之间的接口程序&#xff0c;如果把硬件想象成一个球体的中心&#xff0c;内核围绕在硬件的外层管理着…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有…

C语言第十九弹---指针(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、数组名的理解 2、使用指针访问数组 3、⼀维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 总结 1、数组名的理解…

基于SSM的协同过滤技术的网上书城(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的协同过滤技术的网上书城&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Sp…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…