嵌入式Linux:线程同步(自旋锁)

原创 美男子玩编程 2025-03-17 08:02

点击上方蓝色字体,关注我们


Linux 自旋锁(spinlock)是一种用于保护共享资源的锁机制,常用于多核处理器中,在某个核(或线程)试图获取锁时,如果发现锁已被其他核持有,它会忙等(不断循环检查)而不是让出 CPU 时间片。


自旋锁的特点是适用于锁的持有时间非常短的场景,因为它在等待期间不会主动放弃 CPU,而是不断尝试获取锁,这在多核系统中可以避免由于线程调度带来的上下文切换开销。


工作原理:

  • 加锁线程尝试获取锁,如果成功,则进入临界区。如果锁已经被占用,线程会不停地轮询检查锁是否释放。
  • 忙等(自旋)如果锁被占用,线程会持续忙等,不会主动让出 CPU。这样避免了上下文切换,但消耗了 CPU 资源,因此自旋锁适用于锁定时间较短的场景。
  • 解锁当临界区的任务完成后,线程释放锁,其他正在忙等的线程可以继续尝试获取锁。


自旋锁常用于以下情况:

  • 需要保护的代码段执行时间非常短,能够迅速释放锁。
  • 不希望线程进入睡眠状态或导致上下文切换,尤其是在内核中的中断处理程序或者性能要求高的系统。
  • 多核系统中,并发访问的共享资源保护,避免线程在上下文切换中浪费时间。


自旋锁与互斥锁的比较如下:


实现方式上的区别

  • 自旋锁是一种轻量级锁机制,它本质上是在忙等状态下获取锁。当线程无法获取锁时,线程不会进入睡眠或等待状态,而是会不断地检查锁的状态,直到可以成功获取锁。
  • 互斥锁则是一种更高层的锁,通常在无法获取锁时会导致线程进入阻塞状态。互斥锁可以让操作系统将当前线程挂起,等待锁可用时再唤醒。


开销上的区别

  • 自旋锁的主要优势在于没有上下文切换的开销,特别适用于锁持有时间很短的场景。由于自旋锁不会导致线程休眠,所以在处理器繁忙时可能会浪费 CPU 时间。如果等待时间较长,忙等会消耗过多的 CPU 资源,反而导致效率下降。
  • 互斥锁的开销较大,因为线程在获取不到锁时会陷入休眠,直到获取到锁时才会被唤醒。休眠和唤醒的代价很高,特别是在频繁锁定/解锁的场景中会影响性能。


适用场景上的区别

  • 自旋锁常用于内核中或者需要避免上下文切换的场景。特别是在中断上下文中,自旋锁更为合适,因为中断处理程序不能被阻塞或休眠。它适用于那些执行时间极短的临界区,锁的持有时间必须足够短,才能避免因自旋导致 CPU 资源浪费。
  • 互斥锁更适用于用户态的程序或者锁定时间较长的临界区。当程序无法获取到互斥锁时,系统可以调度其他线程运行,直到锁被释放,适合长时间的等待操作。


死锁问题

  • 如果对同一个自旋锁进行两次加锁操作,必然会导致死锁,因为自旋锁不具备递归性。
  • 互斥锁则可以通过特定的类型来避免死锁。例如 PTHREAD_MUTEX_ERRORCHECK 类型的互斥锁在检测到重复加锁时,会返回错误而不是陷入死锁状态。

1


自旋锁初始化与销毁

自旋锁需要在使用前进行初始化,并在不再使用时销毁。


初始化自旋锁函数如下:


int pthread_spin_init(pthread_spinlock_t *lockint pshared);

参数

  • lock:指向需要初始化的自旋锁对象。
  • pshared:自旋锁的共享属性,可以取值:
    • PTHREAD_PROCESS_SHARED:允许在多个进程中的线程之间共享自旋锁。
    • PTHREAD_PROCESS_PRIVATE:自旋锁只能在同一进程内的线程之间使用。

返回值:成功时返回 0,失败时返回非零错误码。


销毁自旋锁函数如下:


int pthread_spin_destroy(pthread_spinlock_t *lock);

参数:lock:指向要销毁的自旋锁对象。

返回值:成功时返回 0,失败时返回非零错误码。


2


自旋锁加锁与解锁

加锁函数如下:


int pthread_spin_lock(pthread_spinlock_t *lock);

参数:lock:指向要加锁的自旋锁对象。

返回值:成功时返回 0;如果锁已经被其他线程占用,则线程会忙等,直到成功获取锁,最终返回 0。


尝试加锁函数如下:


int pthread_spin_trylock(pthread_spinlock_t *lock);

参数:lock:指向要加锁的自旋锁对象。

返回值

  • 成功时返回 0。
  • 如果锁已被占用,立即返回 EBUSY。


解锁函数如下:


int pthread_spin_unlock(pthread_spinlock_t *lock);

参数:lock:指向要解锁的自旋锁对象。

返回值:成功时返回 0,失败时返回非零错误码。


下面是一个完整的示例,展示如何使用自旋锁,包括初始化、加锁、解锁和销毁:

pthread_spinlock_t spinlock; // 定义自旋锁int shared_data = 0// 共享数据void *thread_func(void *arg) {    pthread_spin_lock(&spinlock); // 加锁    shared_data++;    printf("Thread %ld: shared_data = %d\n", (long)arg, shared_data);    pthread_spin_unlock(&spinlock); // 解锁    return NULL;}int main() {    pthread_t threads[2];    // 初始化自旋锁    if (pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE) != 0) {        perror("Failed to initialize spinlock");        return 1;    }    // 创建两个线程    pthread_create(&threads[0], NULL, thread_func, (void *)1);    pthread_create(&threads[1], NULL, thread_func, (void *)2);    // 等待线程结束    pthread_join(threads[0], NULL);    pthread_join(threads[1], NULL);    // 销毁自旋锁    if (pthread_spin_destroy(&spinlock) != 0) {        perror("Failed to destroy spinlock");        return 1;    }    return 0;}

自旋锁的主要问题在于,它在获取不到锁时不会释放 CPU,而是持续消耗资源。


如果锁持有时间较长,CPU 的利用效率会急剧下降。


因此,自旋锁不适合用于长时间锁定的场景,只适合那些临界区极短的操作。


通过对 pthread_spin_* 函数的合理使用,可以有效管理多线程访问共享资源的同步问题。


确保在适当的地方进行加锁和解锁,以防止死锁和资源竞争。

点击阅读原文,更精彩~

美男子玩编程 多领域、有深度的开发者交流平台
评论 (0)
  • 随着汽车行业逐步迈向电气化和电池动力,位置传感器以及其他长期在车辆中被忽视但却至关重要的小型元器件正逐渐成为关注的焦点。某些电子元器件常常吸引大量关注,例如如今用于训练AI模型的强大GPU几乎每天都出现在新闻中。而其他元器件则默默地执行着重要但鲜为人知的功能。艾迈斯欧司朗一些历史悠久的产品线便隶属于后者,其中包括磁性和电感式位置传感器、电容式传感器和电池监控芯片。工业泵和风扇等产品的制造商利用位置传感器实现电动机高效平稳运行。在车辆的方向盘中安装电容传感器可以保障安全,它可以用于在辅助驾驶模式下
    艾迈斯欧司朗 2025-03-17 22:22 73浏览
  • 失效模式与影响分析(FMEA)失效模式与影响分析(FMEA)是一种系统方法,用于识别和分析系统或过程中的潜在失效,广泛应用于工程和制造领域,以提高产品可靠性和安全性。最新标准由 2019 年发布的 AIAG-VDA FMEA 手册(第一版) 定义,该手册结合了美国和欧洲汽车行业的最佳实践,并引入了 七步法,确保分析全面且结构化。图:优思学院六西格玛新版 FMEA 失效分析的七个步骤1. 规划与准备确定 FMEA 研究的 范围、边界和目标。组建跨职能团队(设
    优思学院 2025-03-17 14:43 114浏览
  • 文/Leon编辑/cc孙聪颖‍蛇年春晚最有意思的节目,一定非机器人跳舞莫属。就算是遥控或预编程,机器人能够做出如此复杂的动作,在五年前都是不敢想象的事情,其制造商宇树科技也因此火爆全网。就在春节过后不到一个月,会骑自行车的人形机器人诞生了。这背后,是近年来“具身智能”概念的迅猛发展。“我们造了一个跟人一样灵动的机器人!”3月11日,智元机器人联合创始人兼首席技术官彭志辉在微博上说道。在视频中,灵犀X2会骑自行车、能跳《科目三》,还可以与人促膝长谈,甚至拿起葡萄“穿针引线”。在全球人形机器人领域,
    华尔街科技眼 2025-03-17 12:38 112浏览
  • 在工业4.0与智能制造深度融合的今天,设备实时性、稳定性和成本效益成为企业核心竞争力的关键。触觉智能将基于RK3506平台,分享工业应用方案,本期为大家带来DSMC串行接口在数控行业的应用。DSMC技术解析底层架构突破双倍数据速率:通过上升沿与下降沿双重触发机制,实现单周期内2倍数据吞吐量,较传统SPI接口效率提升300%。多通道并行:支持8线/16线位宽可配置模式,满足多轴协同场景下的同步通信需求。性能实测标杆超低延迟:FPGA互联场景下,写延时小于75ns,读延时小于260ns,相比PCIe
    Industio_触觉智能 2025-03-18 11:46 54浏览
  • 近期,据全球物联网市场调研机构IoT Analytics公布数据显示,2025年全球物联网设备连接数预计将突破200亿,同比增长约14%,物联网技术正以稳定上升态势向工业自动化、智慧城市、智慧农业与智慧家居等领域纵深推进。在多样化的应用场景和复杂环境需求的驱动下,物联网无线通信技术的运行功耗、传输距离和频段兼容性正受到前所未有的关注。为增加物联网通信模块的配置灵活度,消除物联网设备的“连接焦虑”,华普微重磅推出了一款自主研发的超低功耗、可兼容Sub-GHz与2.4GHz 双频段的高性能LoRa
    华普微HOPERF 2025-03-18 15:43 52浏览
  • 新兴的个人健康监测技术为何在医疗场景和日常生活中越来越受到青睐?为了准确回答这个关键问题,我们首先需要理解三个全球性趋势:如今,几乎人手一部智能手机,这等于随身携带了一台高性能计算机、一个全天候运行的智能医疗传感器中心,还有一块显示屏。发达工业国家的人口正在迅速老龄化,而老年群体的疾病发病率较高。与此同时,年轻人也比过去更加关注如何延长健康寿命。这些人群以及服务他们的医务人员可以利用新技术来优化生活方式,合理调控运动、饮食、睡眠和压力等关键因素,帮助他们作出更健康的生活选择。如摩尔定律所预言,半
    艾迈斯欧司朗 2025-03-17 21:50 75浏览
  • 一、问题现象:语音播放异常的典型表现在使用WT588F(E)系列语音芯片的开发过程中,工程师常会遇到以下两类典型异常现象:播放不全:语音仅播放前段内容后突然中断,或特定段落无法触发播放断续:音频输出存在明显卡顿、爆音或波形畸变某智能门锁项目实测数据显示,在首批样机中有2%的设备出现语音提示突然中断的情况,经排查发现电源电压在播放瞬间跌落至2.0V(低于芯片工作阈值)。这类问题的根源往往隐藏于硬件设计与系统协同的细节之中。二、核心机理:电压稳定性对语音芯片的影响2.1 电源系统的动态响应特性WT5
    广州唯创电子 2025-03-17 09:18 127浏览
  • 在招聘合适的人才时,清晰度至关重要。想要找到合适的人选,并确保他们在岗位上取得成功,第一步就是明确职位的关键绩效指标(KPI)和预期成果。但光有这些还不够,如何判断候选人是否具备必要的特质?这时,KSA模型就派上用场了。它是一个简单但强大的方法,能帮助你聚焦于真正影响岗位表现的关键要素。今天,我想和你聊聊这个模型,帮你更轻松地为合适的候选人设定合适的KPI。了解KSA模型KSA代表知识(Knowledge)、技能(Skills)和态度(Attitude),是评估候选人是否适合岗位的三个关键维度。
    优思学院 2025-03-18 15:03 52浏览
  • 近日,2025年GTI国际产业大会成功举办,活动上GTI Awards 2025获奖名单正式揭晓,紫光展锐连续三年斩获国际权威机构GTI颁发的大奖。此次,T8300凭借在5G技术创新和娱乐体验方面的卓越表现,荣获GTI“移动技术创新突破奖”(Innovative Breakthrough in Mobile Technology Award)。GTI是由中国移动、软银、沃达丰等运营商于2011年发起成立的国际产业合作平台。GTI Awards作为全球通信行业最具影响力的奖项之一,旨在表彰为行业
    紫光展锐 2025-03-14 17:35 78浏览
  •        在工业视觉检测线上,一台搭载传统图像传感器的机器人因高温导致图像噪点激增,误将合格零件判定为瑕疵品,每小时损失超10万元;在深夜的安防监控画面中,模糊的噪点让犯罪分子身影难以识别,导致案件侦破延迟—— 噪声,已成为图像传感器行业的“无声杀手”。据Yole统计,全球约35%的工业检测误差源于传感器噪声干扰,而安防场景下60%的有效信息因低照度噪点丢失。传统方案试图通过单一优化像素或电路来降噪,却陷入“按下葫芦浮起瓢”的困境。  &nb
    中科领创 2025-03-18 10:24 49浏览
  • 在制药行业中,生产工艺的精准控制与产品质量安全密切相关。随着制药工业4.0的发展,传感器作为生产流程的"感知器官",在确保合规性、提升效率、降低风险方面发挥着不可替代的作用。本文将以晨穹电子科技(以下简称"晨穹")的压力、温度、流量及液位传感器为例,解析制药厂关键工艺流程中的传感器应用场景及技术要求。一、制药核心工艺流程中的传感器需求1. 原料处理与配液系统液位监测:储罐内原料液位实时监控需使用卫生型液位计。晨穹磁翻板液位计采用316L不锈钢材质,具备CIP/SIP(在线清洗/灭菌)耐受性,符合
    传感器晨穹 2025-03-18 15:51 54浏览
  • 晨穹电子一家专业从事研发、生产、销售各类传感器为一体的高新科技企业。1 人赞同了该文章在工业4.0、智能家居、新能源汽车等场景中,传感器作为数据采集的核心器件,其抗电磁干扰(EMC)能力直接影响系统可靠性。尤其在5G通信、高功率电机、无线充电等复杂电磁环境下,传感器的信号失真问题愈发突出。本文结合MEMS传感器、物联网(IoT)设备、边缘计算等热度技术,解析提升传感器抗干扰能力的6大策略。 一、电磁干扰对传感器的威胁; 1、电磁干扰(EMI)会导致传感器出现 。2、信号跳变(
    传感器晨穹 2025-03-18 09:28 83浏览
  • 一、引言:语音芯片的智能化浪潮在万物互联的智能化时代,语音交互技术已成为人机交互的重要纽带。从智能家电的提示音到儿童玩具的趣味互动,从工业设备的语音告警到公共服务设施的自动播报,语音播放芯片IC作为核心硬件支撑,正在重塑各行各业的用户体验。在众多解决方案中,WTN6、WT588、WT2003H、WTV四大系列产品,凭借差异化的技术特性构建了完整的语音芯片产品矩阵。本文将深度解析这四大主流芯片的技术特点与应用场景,为开发者提供选型参考。二、主流语音芯片技术特性全解析2.1 WTN6系列:高性价比的
    广州唯创电子 2025-03-17 09:04 146浏览
  • esp32s3使用platformio 点亮1.69寸TFT历程之LVGL移植 继上一篇我历经很久的时间点亮了1.69寸TFT之后。我开始进行LVGL的移植。开始LVGL的学习。用platformio 开发esp32s3真的好方便。按照上一节的环境。本次由于需要使用LVGL。打开platformio lib界面搜索LVGL。目前里面的版本是9.2.2。我使用的8.3.6。然后按照下图加载到自己的工程项目。待加载完毕后。我们会看到libdeps下面会出现LVGL库好了,这一步完成后。我们就开始移植
    zhusx123 2025-03-15 20:58 119浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦