SoC如何实现线程安全?

原创 美男子玩编程 2024-12-15 08:00

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

在 SoC上实现线程安全是多线程编程中非常关键的一个问题,特别是当涉及资源共享时。


线程安全的设计目的是避免多个线程同时访问共享资源时出现竞争条件、数据竞争等问题。


1


线程栈(Thread Stack)

在多线程系统中,每个线程都有自己独立的栈,用于存储局部变量、函数调用的返回地址等。


栈的独立性是线程安全的基础之一,因为栈是线程私有的,不会与其他线程共享。


因此,所有存储在栈上的数据,比如局部变量、函数参数等,默认是线程安全的。


细节分析:

  • 栈的分配SoC 上的多核处理器或多线程操作系统(如 Linux、RTOS)为每个线程分配独立的栈。在 Cortex-M 系列的 ARM 处理器上,栈指针(SP)用于跟踪每个线程的栈顶位置。每个线程的栈是从操作系统堆栈池或系统内存中分配的。

  • 中断和线程栈在实时操作系统中,如果在中断期间发生线程切换,处理器需要保存当前线程的栈指针,并加载下一个线程的栈指针。这一过程称为“上下文切换”,它依赖于栈的独立性以确保线程安全。


以下示例中local_var 是局部变量,位于栈中,因此不同线程各自拥有自己的 local_var,不会造成资源竞争。


void thread_function() {int local_var = 0; // 局部变量保存在当前线程的栈中local_var += 1;printf("Thread local variable: %d\n", local_var);}

2


可重入函数(Reentrant Function)

可重入函数是指多个线程可以同时调用而不会引发竞争条件的函数。


为了实现可重入,函数必须:

  1. 不使用静态数据(除非有线程安全的保护机制)。

  2. 不依赖共享资源,或者对共享资源进行保护(如通过锁定机制)。

  3. 不返回指向静态或全局数据的指针。


细节分析:

  • 静态变量的危险性静态变量在全局内存中分配,所有线程共享该变量,因此多个线程同时访问或修改静态变量时会导致数据竞争。如果需要使用静态数据,必须通过锁或其他同步机制来保护它。

  • 递归函数问题递归函数需要特别注意,如果递归函数使用全局或静态数据,那么它在不同线程递归调用时就会出现问题。


以下示例中non_reentrant_function 中的 static_var 是共享的,多个线程访问时会产生竞态条件;而 reentrant_function 仅使用局部变量,是线程安全的。


int non_reentrant_function(int a) {    static int static_var = 0;  // 静态变量导致线程不安全    static_var += a;    return static_var;}
int reentrant_function(int a, int b) { return a + b; // 不使用任何共享资源,线程安全}

3


线程安全函数(Thread-Safe Function)

为了让函数在并发环境下是线程安全的,常用的方式是使用同步机制来保护共享资源。


典型的同步机制包括:

  • 互斥锁(Mutex)防止多个线程同时访问共享资源。

  • 读写锁(Read-Write Lock)允许多个线程同时读,但写操作是排他的。

  • 信号量(Semaphore)控制访问共享资源的线程数量。

  • 自旋锁(Spinlock)当需要保护的代码执行时间很短时,使用自旋锁可以避免线程休眠,提高效率。


细节分析:

  • 互斥锁的开销在资源竞争较少的情况下,互斥锁可能会导致性能下降,特别是在 SoC 系统上,因为线程切换和上下文切换的开销较大。在嵌入式系统中,自旋锁有时会被用来代替互斥锁,以减少因线程休眠带来的额外开销。

  • 自旋锁的使用场景自旋锁适用于在多核处理器上,线程在短时间内可以完成任务而不需要休眠的场景。自旋锁会让线程忙等待,直到获取锁,但会消耗 CPU 资源。


以下示例通过 pthread_mutex_lock 和 pthread_mutex_unlock 对共享变量 shared_resource 进行加锁和解锁操作,确保只有一个线程可以在同一时间修改 shared_resource。


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int shared_resource = 0;
void* thread_safe_function(void* arg) { pthread_mutex_lock(&mutex); // 加锁保护共享资源 shared_resource += 1; printf("Shared resource: %d\n", shared_resource); pthread_mutex_unlock(&mutex); // 解锁 return NULL;}

4


一次性初始化(One-Time Initialization)

在多线程环境中,有时某个共享资源或全局变量只需要初始化一次,比如一个全局配置或共享对象。


为了确保初始化操作的线程安全,可以使用 pthread_once 来保证只初始化一次。


细节分析:

  • 双重检查锁定(Double-Checked Locking)为了减少加锁开销,有时会使用双重检查锁定,先检查是否已经初始化,如果没有再加锁并初始化。双重检查锁定是为了避免不必要的锁定开销,特别是在初始化后频繁读取全局变量的场景中。

  • 内存屏障问题在某些多核处理器上,编译器和 CPU 可能会重排指令,导致初始化操作和赋值顺序不一致。为了解决这个问题,内存屏障可以确保在多核系统中操作的顺序一致。


以下示例pthread_once 确保无论有多少个线程,initialize_resource 函数都只会被调用一次,保证了线程安全的初始化。


pthread_once_t once_control = PTHREAD_ONCE_INIT;
void initialize_resource() { printf("Resource initialized.\n");}
void* thread_function(void* arg) { pthread_once(&once_control, initialize_resource); // 保证初始化只发生一次 printf("Thread is running.\n"); return NULL;}

5


线程特有数据(Thread-Specific Data)

线程特有数据(Thread-Specific Data, TSD)允许每个线程拥有自己的数据副本,而这些数据不会被其他线程访问。


可以使用 pthread_key_create、pthread_setspecific 和 pthread_getspecific 来管理线程特有数据。


每个线程都有独立的存储空间来保存它的特有数据,因此不会引发竞态条件。


细节分析:

  • 线程局部存储的工作原理在实现上,TSD 通常使用哈希表或数组进行存储,每个线程都有自己的独立副本,操作系统或线程库负责在上下文切换时保存和恢复线程的特有数据。

  • 销毁线程特有数据当线程退出时,应该确保特有数据得到适当销毁。这通常可以通过设置销毁函数(destructor)来自动释放资源。


以下示例每个线程都通过 pthread_setspecific 设置自己的特有数据,并通过 pthread_getspecific 获取数据,保证了每个线程的数据是独立的,线程安全。


pthread_key_t tls_key;
void destructor(void* value) { free(value); // 销毁线程特定的数据}
void* thread_function(void* arg) { int* thread_data = (int*)malloc(sizeof(int)); *thread_data = 1; pthread_setspecific(tls_key, thread_data); // 设置当前线程的特有数据
printf("Thread-specific data: %d\n", *(int*)pthread_getspecific(tls_key)); return NULL;}
int main() { pthread_key_create(&tls_key, destructor); // 创建 TLS key 并设置销毁函数
pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_function, NULL); pthread_create(&thread2, NULL, thread_function, NULL);
pthread_join(thread1, NULL); pthread_join(thread2, NULL);
pthread_key_delete(tls_key); // 删除 TLS key return 0;}

6


线程局部存储(Thread Local Storage, TLS)

线程局部存储是一种更方便的方式,允许每个线程有一组私有的全局变量副本,避免多个线程之间的共享。


大多数编译器提供了内置支持,例如在 GCC 中,__thread 关键字可以用于声明线程局部变量。


细节分析:

  • TLS 的实现机制在 SoC 系统或嵌入式操作系统中,TLS 通常通过 CPU 的上下文切换机制来实现。每个线程的上下文不仅包括寄存器,还包括 TLS 的数据段。TLS 的数据结构通常存储在线程控制块(Thread Control Block, TCB)中,每个线程拥有独立的 TCB。


以下示例__thread 关键字声明的 tls_var 是线程局部变量,每个线程都有自己的副本,因此是线程安全的。


__thread int tls_var = 0;
void* thread_function(void* arg) { tls_var += 1; printf("TLS variable: %d\n", tls_var); return NULL;}


SoC 上的线程安全设计需要在多个层面加以考虑,从栈隔离到复杂的同步机制(如互斥锁、信号量等),不同机制有不同的应用场景。


线程特有数据和 TLS 提供了更灵活的数据管理方式,使得每个线程能够独立存储和访问它的特有数据,避免数据竞争问题。

点击阅读原文,更精彩~

美男子玩编程 多领域、有深度的开发者交流平台
评论 (0)
  • 贞光科技作为三星电机车规电容代理商,针对电动汽车领域日益复杂的电容选型难题,提供全方位一站式解决方案。面对高温稳定性、高可靠性、高纹波电流和小型化等严苛要求,三星车规电容凭借完整产品矩阵和卓越技术优势,完美满足BMS、电机控制器和OBC等核心系统需求。无论技术选型、供应链保障、样品测试还是成本优化,贞光科技助力客户在电动汽车产业高速发展中占据技术先机。在电动汽车技术高速发展的今天,作为汽车电子系统中不可或缺的关键元器件,电容的选型已成为困扰许多工程师和采购人员的难题。如何在众多参数和型号中找到最
    贞光科技 2025-04-07 17:06 69浏览
  • 在万物互联时代,智能化安防需求持续升级,传统报警系统已难以满足实时性、可靠性与安全性并重的要求。WT2003H-16S低功耗语音芯片方案,以4G实时音频传输、超低功耗设计、端云加密交互为核心,重新定义智能报警设备的性能边界,为家庭、工业、公共安防等领域提供高效、稳定的安全守护。一、技术内核:五大核心突破,构建全场景安防基座1. 双模音频传输,灵活应对复杂场景实时音频流传输:内置高灵敏度MIC,支持环境音实时采集,通过4G模块直接上传至云端服务器,响应速度低至毫秒级,适用于火灾警报、紧急呼救等需即
    广州唯创电子 2025-04-08 08:59 133浏览
  •     在研究Corona现象时发现:临界电压与介电材料表面的清洁程度有关。表面越清洁的介电材料,临界电压越高;表面污染物越多的地方,越容易“爬电”。关于Corona现象,另见基础理论第007篇。    这里说的“污染物”,定义为——可能影响介电强度或表面电阻率的固体、液体或气体(电离气体)的任何情况。    IEC 60664-1 (对应GB/T 16935.1-2023) 定义了 Pollution Degree,中文术语是“污染等
    电子知识打边炉 2025-04-07 22:06 95浏览
  • HDMI从2.1版本开始采用FRL传输模式,和2.0及之前的版本不同。两者在物理层信号上有所区别,这就需要在一些2.1版本的电路设计上增加匹配电路,使得2.1版本的电路能够向下兼容2.0及之前版本。2.1版本的信号特性下面截取自2.1版本规范定义,可以看到2.1版本支持直流耦合和交流耦合,其共模电压和AVCC相关,信号摆幅在400mV-1200mV2.0及之前版本的信号特性HDMI2.0及之前版本采用TMDS信号物理层,其结构和参数如下:兼容设计根据以上规范定义,可以看出TMDS信号的共模电压范
    durid 2025-04-08 19:01 132浏览
  •   卫星图像智能测绘系统全面解析   一、系统概述   卫星图像智能测绘系统是基于卫星遥感技术、图像处理算法与人工智能(AI)技术的综合应用平台,旨在实现高精度、高效率的地理空间数据获取、处理与分析。该系统通过融合多源卫星数据(如光学、雷达、高光谱等),结合AI驱动的智能算法,实现自动化、智能化的测绘流程,广泛应用于城市规划、自然资源调查、灾害监测等领域。   应用案例   目前,已有多个卫星图像智能测绘系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星图像智能测绘系统
    华盛恒辉l58ll334744 2025-04-08 15:04 59浏览
  • 文/Leon编辑/cc孙聪颖‍转手绢、跳舞、骑车、后空翻,就在宇树、智元等独角兽企业率领“机器人大军”入侵短视频时,却有资本和科技大佬向此产业泼了一盆冷水。金沙江创投管理合伙人朱啸虎近日突然对人形机器人发难,他表示“最近几个月正在批量退出人形机器人公司”。“只是买回去做研究的,或者买回去做展示的,这种都不是我们意义上的商业化,谁会花十几万买一个机器人去干这些活?”朱啸虎吐槽。不过,朱啸虎的观点很快就遭到驳斥,众擎机器人的创始人、董事长赵同阳回怼道:“(朱啸虎)甚至问出了人形机器人在这个阶段有什么
    华尔街科技眼 2025-04-07 19:24 148浏览
  •     根据 IEC术语,瞬态过电压是指持续时间几个毫秒及以下的过高电压,通常是以高阻尼(快速衰减)形式出现,波形可以是振荡的,也可以是非振荡的。    瞬态过电压的成因和机理,IEC 60664-1给出了以下四种:    1. 自然放电,最典型的例子是雷击,感应到电力线路上,并通过电网配电系统传输,抵达用户端;        2. 电网中非特定感性负载通断。例如热处理工厂、机加工工厂对
    电子知识打边炉 2025-04-07 22:59 126浏览
  •   工业自动化领域电磁兼容与接地系统深度剖析   一、电磁兼容(EMC)基础认知   定义及关键意义   电磁兼容性(EMC),指的是设备或者系统在既定的电磁环境里,不但能按预期功能正常运转,而且不会对周边其他设备或系统造成难以承受的电磁干扰。在工业自动化不断发展的当下,大功率电机、变频器等设备被大量应用,现场总线、工业网络等技术也日益普及,致使工业自动化系统所处的电磁环境变得愈发复杂,电磁兼容(EMC)问题也越发严峻。   ​电磁兼容三大核心要素   屏蔽:屏蔽旨在切断电磁波的传播路
    北京华盛恒辉软件开发 2025-04-07 22:55 204浏览
  • 在全球电子产业面临供应链波动、技术迭代和市场需求变化等多重挑战的背景下,安博电子始终秉持“让合作伙伴赢得更多一点”的核心理念,致力于打造稳健、高效、可持续的全球供应链体系。依托覆盖供应商管理、品质检测、智能交付的全链路品控体系,安博电子不仅能确保电子元器件的高可靠性与一致性,更以高透明的供应链管理模式,助力客户降低风险、提升运营效率,推动行业标准升级,与全球合作伙伴共同塑造更具前瞻性的产业生态。动态优选机制:构建纯净供应链生态安博电子将供应商管理视为供应链安全的根基。打造动态优选管控体系,以严格
    电子资讯报 2025-04-07 17:06 95浏览
  •   卫星图像智能测绘系统:地理空间数据处理的创新引擎   卫星图像智能测绘系统作为融合卫星遥感、地理信息系统(GIS)、人工智能(AI)以及大数据分析等前沿技术的综合性平台,致力于达成高精度、高效率的地理空间数据采集、处理与应用目标。借助自动化、智能化的技术路径,该系统为国土资源管理、城市规划、灾害监测、环境保护等诸多领域输送关键数据支撑。   应用案例   目前,已有多个卫星图像智能测绘系统在实际应用中取得了显著成效。例如,北京华盛恒辉北京五木恒润卫星图像智能测绘系统。这些成功案例为卫星
    华盛恒辉l58ll334744 2025-04-08 16:19 58浏览
  • 及时生产 JIT(Just In Time)的起源JIT 起源于 20 世纪 70 年代爆发的全球石油危机和由此引发的自然资源短缺,这对仰赖进口原物料发展经济的日本冲击最大。当时日本的生产企业为了增强竞争力、提高产品利润,在原物料成本难以降低的情况下,只能从生产和流通过程中寻找利润源,降低库存、库存和运输等方面的生产性费用。根据这种思想,日本丰田汽车公司创立的一种具有特色的现代化生产方式,即 JIT,并由此取得了意想不到的成果。由于它不断地用于汽车生产,随后被越来越多的许多行业和企业所采用,为日
    优思学院 2025-04-07 11:56 109浏览
  • 曾几何时,汽车之家可是汽车资讯平台领域响当当的“扛把子”。2005 年成立之初,它就像一位贴心的汽车小助手,一下子就抓住了大家的心。它不仅吸引了海量用户,更是成为汽车厂商和经销商眼中的“香饽饽”,广告投放、合作推广不断,营收和利润一路高歌猛进,2013年成功在纽交所上市,风光无限。2021年更是在香港二次上市,达到了发展的巅峰,当年3月15日上市首日,港股股价一度高达184.6港元,市值可观。然而,如今的汽车之家却陷入了困境,业务下滑明显。业务增长瓶颈从近年来汽车之家公布的财报数据来看,情况不容
    用户1742991715177 2025-04-07 21:48 113浏览
  • 在人工智能技术飞速发展的今天,语音交互正以颠覆性的方式重塑我们的生活体验。WTK6900系列语音识别芯片凭借其离线高性能、抗噪远场识别、毫秒级响应的核心优势,为智能家居领域注入全新活力。以智能风扇为起点,我们开启一场“解放双手”的科技革命,让每一缕凉风都随“声”而至。一、核心技术:精准识别,无惧环境挑战自适应降噪,听懂你的每一句话WTK6900系列芯片搭载前沿信号处理技术,通过自适应降噪算法,可智能过滤环境噪声干扰。无论是家中电视声、户外虫鸣声,还是厨房烹饪的嘈杂声,芯片均能精准提取有效指令,识
    广州唯创电子 2025-04-08 08:40 167浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦