多线程并发锁的方案
C语言的多线程并发锁方案主要依赖于POSIX线程库pthread。互斥锁核心行为当线程无法获取锁时会陷入睡眠让出CPU直到锁可用时被唤醒。适用场景通用场景特别是临界区执行时间较长如涉及I/O操作、复杂计算时。它能有效避免CPU资源的浪费。相关函数#include pthread.h /* 互斥锁初始化 mutex:指向要初始化的互斥锁对象的指针。 attr:指向互斥锁属性对象的指针。如果传入NULL则使用默认属性进行初始化(通常对应非递归、非检错类型的“快速锁”)。 */ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); /* 对指定的互斥锁进行加锁操作。 如果锁当前未被任何线程持有调用线程将立即获得锁并继续执行。 若锁已被其他线程持有调用线程将阻塞进入睡眠状态直到锁被释放。 */ int pthread_mutex_lock(pthread_mutex_t *mutex); /* 释放当前线程持有的互斥锁。 如果有其他线程正在等待该锁等待队列中的某个线程将被唤醒并获得锁。 */ int pthread_mutex_unlock(pthread_mutex_t *mutex); /* 销毁一个互斥锁释放其可能占用的资源(如内核资源、动态内存等)。 */ int pthread_mutex_destroy(pthread_mutex_t *mutex);自旋锁核心行为自旋锁是另一种重要的同步机制它的核心行为与互斥锁有本质的不同当锁被占用时等待线程会在一个循环中不断检查即旋转而不会像互斥锁那样陷入睡眠。适用场景锁持有时间极短且临界区执行很快如仅改变一个变量。#include pthread.h /* 初始化自旋锁。 pashread参数决定锁的共享范围 PTHREAD_PROCESS_PRIVATE:只能在初始化该锁的进程内的线程间使用默认、常用。 PTHREAD_PROCESS_SHARED:允许在不同进程的线程间使用锁需位于共享内存。 */ int pthread_spin_init(pthread_spinlock_t *lock, int pashread); /* 加锁。如果锁已被占用调用线程将一直旋转占用CPU循环检查直到锁可用。 */ int pthread_spin_lock(pthread_spinlock_t *lock); /* 解锁。 */ int pthread_spin_unlock(pthread_spinlock_t *lock); /* 销毁自旋锁释放其占用的资源。 */ int pthread_spin_destory(pthread_spinlock_t *lock);原子指令原子指令是硬件级别提供的工作保证对一个内存位置的读---修改---写过程是不可分割的在执行期间 不会被其他线程或中断打断。获取并增减Fetch-and Add)// 原子加法操作fetch-and-add int inc(int *value, int add) { int old; __asm__ volatile( lock; xaddl %2, %1; :a (old) :m(*value), a(add) :cc,memory ); return old; }比较和交换(Compare-and-Swap,CAS)// 比较和交换Compare-and-Swap / Compare-and-Set // 这是一种用于多线程编程的原子指令用于实现并发算法中的同步。 // 作用 它比较一个内存位置的值和给定的值只有在相同的情况下 // 才会将该内存位置的值修改为新的给定值。这个过程是原子的不可中断的 // 可以防止数据竞争。 int inc_cas(int *value, int add) { int old, newVal, expected; expected *value; do { old expected; newVal old add; __asm__ volatile( lock cmpxchg %2, %1 : a(expected), m(*value) : r(newVal), 0(old) : cc, memory ); } while (expected ! old); return old; }条件变量互斥锁条件变量是线程同步中等待某个条件成立的重要工具。它总是与互斥锁配合使用因为条件的检查与状态的改变必须在同一把锁的保护下进行以避免竞态条件。考虑一个常见的场景生产者-消费者问题。消费者需要等待队列非空才能取数据生产者往队列放入数据后通知消费者。如果只用互斥锁消费者可能需要循环检查队列状态忙等待浪费CPU,或者无法在条件不满足时高效的让出CPU。条件变量解决了这个问题它允许一个线程在条件不满足时阻塞休眠并释放互斥锁当条件被改变时另一个线程可以唤醒等待的线程使其重新获取锁并继续执行。条件变量相关函数/* 作用动态初始化条件变量。 参数 cond指向条件变量的指针。 attr属性指针通常传 NULL 使用默认属性。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); /* 作用销毁条件变量释放资源。 注意销毁前必须确保没有线程在等待该条件变量。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_destroy(pthread_cond_t *cond); /* 作用原子地完成以下操作 释放已持有的互斥锁 mutex。 将调用线程阻塞直到条件变量 cond 被唤醒。 被唤醒后重新获取 mutex 并返回。 参数cond 条件变量mutex 当前线程必须已经持有的互斥锁。 注意返回后必须重新检查条件防止虚假唤醒。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex ); /* 唤醒一个正在等待该条件变量的线程。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_signal(pthread_cond_t *cond); /* 唤醒所有正在等待该条件变量的线程。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_broadcast(pthread_cond_t *cond);条件变量互斥锁使用模式等待条件消费者pthread_mutex_lock(mutex); while (条件为假) { // 必须用 while 循环 pthread_cond_wait(cond, mutex); // 原子操作解锁 等待 } // 此时条件为真且持有 mutex执行相应操作 pthread_mutex_unlock(mutex);改变条件并通知 生产者pthread_mutex_lock(mutex); // 修改共享状态使条件变为真 pthread_cond_signal(cond); // 或 pthread_cond_broadcast pthread_mutex_unlock(mutex);

相关新闻

隐藏的“性能开关”,普通用户也能玩转的黑科技

隐藏的“性能开关”,普通用户也能玩转的黑科技

很多手机用户可能都不知道,在设置深处,藏着一个名为“开发者选项”的神秘菜单。它就像手机的“实验室”,里面汇聚了各种未向大众开放的高级功能。很多人误以为这只是程序员用来调试应用的专用工具,普通用户碰不得。其实不然&#…

2026/7/12 16:57:18 阅读更多 →
HiClaw Star 激增,全网征集实践教程

HiClaw Star 激增,全网征集实践教程

作者:望宸、澄潭、计缘 HiClaw 上周开源后,Star 迅速飙涨,同时,多样化的安装环境和多层次的使用场景也带来了大量的咨询。在此,感谢各位开发者提供的建议,我们迅速整理了 FAQ,并已发布到 GitHub…

2026/7/13 2:06:44 阅读更多 →
代码为舟,初心作桨——我的CSDN创作256天纪念

代码为舟,初心作桨——我的CSDN创作256天纪念

今天,当我像往常一样登录CSDN时,收到了一份意外的惊喜。通知告诉我,不知不觉间,我已经在这条创作之路上行走了 256天。 256,一个对程序员来说再熟悉不过的数字。它是2的8次方,是字节的取值范围,…

2026/7/15 16:39:12 阅读更多 →

最新新闻

ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库)

ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT写周报月报:从“凑字数”到“领导主动转发”的5步质变法(附可即用Prompt库) 过去写周报,常陷入“流水账—删减—硬凑—焦虑—交差”的死循环&…

2026/7/15 20:02:53 阅读更多 →
仅限内部团队流传的Cursor筛选秘钥:8个未公开的@指令与#context标记,大幅提升TypeScript项目检索准确率

仅限内部团队流传的Cursor筛选秘钥:8个未公开的@指令与#context标记,大幅提升TypeScript项目检索准确率

更多请点击: https://codechina.net 第一章:Cursor AI搜索筛选机制的核心原理 Cursor AI 的搜索筛选机制并非传统全文检索的简单扩展,而是融合语义理解、上下文感知与代码结构化分析的复合型引擎。其核心在于将用户输入的自然语言查询实时映…

2026/7/15 20:02:53 阅读更多 →
Lighthouse网站性能审计完全手册:从基础配置到高级报告分析

Lighthouse网站性能审计完全手册:从基础配置到高级报告分析

Lighthouse网站性能审计完全手册:从基础配置到高级报告分析 【免费下载链接】lighthouse Automated auditing, performance metrics, and best practices for the web. 项目地址: https://gitcode.com/GitHub_Trending/lig/lighthouse Lighthouse是Google开发…

2026/7/15 20:00:52 阅读更多 →
个人财务健康诊断系统:Bank Scan轻量级落地实践

个人财务健康诊断系统:Bank Scan轻量级落地实践

1. 项目概述:这不是一个“扫描App”,而是一套可落地的个人财务健康诊断系统“Bank Scan: Your Personal Financial Advisor”——光看标题,很多人第一反应是“又一个银行App的营销话术”,或者下意识联想到手机拍照识别银行卡、OCR…

2026/7/15 20:00:52 阅读更多 →
【Cortex-M内核篇】--复位向量表:从硬件加载到软件执行的启动密码

【Cortex-M内核篇】--复位向量表:从硬件加载到软件执行的启动密码

1. 复位向量表:Cortex-M启动的硬件密码本 每次按下开发板的复位按钮时,Cortex-M内核就像拿到了一本加密的启动密码本——复位向量表。这个只有几十字节的小表格,却藏着芯片从"昏迷"到"苏醒"的全部秘密。我曾在调试STM32时…

2026/7/15 19:58:52 阅读更多 →
三款经典DC-DC降压芯片实战测评:LM2596、MP1584与TPS5430的纹波、效率与发热深度解析

三款经典DC-DC降压芯片实战测评:LM2596、MP1584与TPS5430的纹波、效率与发热深度解析

1. 三款降压芯片基础参数对比先来看这三款芯片的基本参数对比表:参数LM2596MP1584TPS5430输入电压范围4.5V-40V4.5V-28V5.5V-36V最大输出电流3A3A3A开关频率150kHz1.5MHz500kHz典型效率75%-85%85%-92%90%-95%工作温度范围-40℃~125℃-40℃~125℃-40℃~150℃封装形式…

2026/7/15 19:56:51 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻