RT-Thread信号量的隐藏技能:除了同步,它还能做资源池管理与流量控制

RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)_rt thread记录(六、 在我们专栏前面的文章中,已经学习过 RT-Thread 线程操作函数、软件定时器、临界区的保护,我们都进行了一些底层的分析,能让我们更加理解 RT-Thread 的内核,但是也不要忽略了上层的函数使用 要理解 RT-Thread 面向对象的思想,对所有的这些线程啊,定时器,包括要介绍的信号量,邮箱这些,都是以 对象 来操作,直白的说来就是 对于所有这些对象,都是以结构体的形式来表示,然后通过对这个对象结构体的操作来进行的。 阅读详情

RT-Thread信号量的隐藏技能:除了同步,它还能做资源池管理与流量控制

在嵌入式系统开发中,信号量常被视为线程同步的基础工具,但它的潜力远不止于此。对于中高级开发者和系统架构师而言,信号量实际上是一个被低估的多面手,能够在资源池管理、流量控制等复杂场景中发挥关键作用。传统认知中,信号量主要用于保护临界区或协调线程执行顺序,然而通过巧妙的设计,它可以成为管理系统有限资源、控制并发访问的强大工具。无论是在网络连接池、任务槽管理还是内存分配调度中,信号量都能提供简洁而高效的解决方案,让系统资源利用率达到最优化。

1. 信号量的基础与进阶理解

信号量作为RT-Thread中的核心同步机制,其基本概念是一个计数器,用于控制对共享资源的访问。常规用法中,开发者通常将其视为一个二进制开关(0或1),用于实现互斥访问,或者作为一个计数机制来协调线程执行顺序。然而,这种传统视角限制了信号量的真正潜力。

实际上,信号量的值代表了可用资源的数量,这一特性使其天然适合管理任何类型的有限资源池。当信号量初始值为N时,意味着系统有N个资源单元可供分配。每个rt_sem_take操作相当于申请一个资源单元,而rt_sem_release则相当于归还资源。这种机制不仅适用于明显的物理资源(如内存块、外设访问),也适用于抽象的逻辑资源(如并发任务槽、网络连接数)。

与互斥量相比,信号量在资源管理方面具有独特优势。互斥量严格遵循"谁获取谁释放"的所有权原则,而信号量则没有这种限制——任何线程都可以释放信号量,这种灵活性使得信号量更适合于资源池模式,其中资源的消费者和生产者可能是不同的线程。

/* 创建资源池信号量示例 */
#define MAX_RESOURCES 5

rt_sem_t resource_pool;

void init_resource_pool(void)
{
    /* 创建信号量,初始值为最大资源数 */
    resource_pool = rt_sem_create("res_pool", MAX_RESOURCES, RT_IPC_FLAG_PRIO);
    if (resource_pool == RT_NULL) {
        rt_kprintf("Failed to create resource pool semaphore\n");
        return;
    }
    rt_kprintf("Resource pool initialized with %d units\n", MAX_RESOURCES);
}

在这个示例中,我们创建了一个具有5个资源单元的资源池,任何需要访问这些资源的线程都必须先通过rt_sem_take获取信号量。当所有资源都被占用时,后续线程将阻塞等待,直到有资源被释放。

2. 资源池管理的实战应用

资源池管理是信号量最直接的高级应用之一。在实际系统中,我们经常需要管理有限的资源,如数据库连接、网络套接字、内存缓冲区或硬件外设访问权限。使用信号量来管理这些资源,可以确保系统不会因为资源过载而崩溃,同时最大化资源利用率。

2.1 连接池管理

在网络应用中,维护与服务器的连接是常见需求,但创建和销毁连接开销很大。连接池通过复用现有连接来提高效率,而信号量是管理连接池的完美工具:

/* 网络连接池实现示例 */
#define MAX_CONNECTIONS 8

rt_sem_t connection_pool;
network_connection_t connections[MAX_CONNECTIONS];

network_connection_t* acquire_connection(void)
{
    /* 等待可用连接 */
    if (rt_sem_take(connection_pool, RT_WAITING_FOREVER) != RT_EOK) {
        return RT_NULL;
    }
    
    /* 查找并返回第一个可用连接 */
    for (int i = 0; i < MAX_CONNECTIONS; i++) {
        if (!connections[i].in_use) {
            connections[i].in_use = RT_TRUE;
            return &connections[i];
        }
    }
    
    /* 正常情况下不应执行到这里 */
    rt_sem_release(connection_pool);
    return RT_NULL;
}

void release_connection(network_connection_t* conn)
{
    if (conn != RT_NULL) {
        conn->in_use = RT_FALSE;
        rt_sem_release(connection_pool);
    }
}

提示:在实际应用中,还需要考虑连接的健康检查机制,确保返回的连接都是可用的。

2.2 内存池调度

在内存受限的嵌入式系统中,动态内存分配往往会导致碎片化问题。使用固定大小的内存池配合信号量管理,可以显著提高内存分配效率和确定性:

内存块大小内存块数量信号量初始值使用场景
64字节1616小型数据包处理
256字节88中等规模数据结构
1024字节44大型缓冲区

这种方法的优势在于:

  • 确定性:分配和释放操作的时间是可预测的
  • 无碎片:使用固定大小的内存块避免了内存碎片问题
  • 溢出保护:当所有内存块都被占用时,新的分配请求会阻塞而不是导致系统崩溃
/* 内存池使用示例 */
rt_sem_t mem_pool_64;
uint8_t mem_blocks_64[16][64];  // 16个64字节的内存块

void* allocate_memory(size_t size)
{
    if (size <= 64) {
        if (rt_sem_take(mem_pool_64, 100) == RT_EOK) {
            // 查找并返回可用内存块
            for (int i = 0; i < 16; i++) {
                if (/* 块未被使用 */) {
                    return mem_blocks_64[i];
                }
            }
            rt_sem_release(mem_pool_64); // 异常情况
        }
    }
    // 处理其他大小或返回错误
    return RT_NULL;
}

3. 流量控制与并发限制

流量控制是信号量的另一个强大应用领域。在高并发系统中,防止系统过载至关重要。通过信号量,我们可以精确控制同时执行特定操作的线程数量,避免资源竞争和性能下降。

3.1 任务槽限制

在某些场景下,我们可能需要限制同时处理某种任务的线程数量。例如,在处理外部设备数据时,同时处理的请求过多可能导致设备响应变慢或失败:

/* 任务槽限制示例 */
#define MAX_CONCURRENT_TASKS 3
rt_sem_t task_slot;

void data_processing_task(void* parameter)
{
    while (1) {
        // 等待可用的任务槽
        rt_sem_take(task_slot, RT_WAITING_FOREVER);
        
        // 执行数据处理任务
        process_data();
        
        // 释放任务槽
        rt_sem_release(task_slot);
    }
}

// 初始化任务槽信号量
void init_task_system(void)
{
    task_slot = rt_sem_create("task_slot", MAX_CONCURRENT_TASKS, RT_IPC_FLAG_FIFO);
}

这种方法确保了无论有多少线程试图执行数据处理任务,同时执行的都不会超过MAX_CONCURRENT_TASKS个,从而防止系统过载。

3.2 API调用频率控制

在与外部服务或设备交互时,通常需要限制调用频率以避免超过对方的能力限制。信号量结合定时器可以实现精确的频率控制:

/* API调用频率控制 */
#define MAX_CALLS_PER_MINUTE 30
rt_sem_t api_rate_limiter;
rt_timer_t rate_timer;

static void replenish_api_tokens(void* parameter)
{
    // 每分钟补充API调用令牌
    for (int i = 0; i < MAX_CALLS_PER_MINUTE; i++) {
        rt_sem_release(api_rate_limiter);
    }
}

void call_external_api(void)
{
    // 获取API调用令牌
    if (rt_sem_take(api_rate_limiter, RT_WAITING_FOREVER) == RT_EOK) {
        // 执行API调用
        execute_api_call();
    }
}

void init_api_rate_limiter(void)
{
    // 初始时没有可用令牌
    api_rate_limiter = rt_sem_create("api_rate", 0, RT_IPC_FLAG_FIFO);
    
    // 创建每分钟补充令牌的定时器
    rate_timer = rt_timer_create("rate_timer", replenish_api_tokens, 
                                RT_NULL, 60*RT_TICK_PER_SECOND, 
                                RT_TIMER_FLAG_PERIODIC);
    rt_timer_start(rate_timer);
}

这种技术确保了对API的调用不会超过每分钟30次,即使有大量线程尝试同时调用。

4. rt_sem_control的高级用法与性能优化

RT-Thread的rt_sem_control函数提供了对信号量的高级控制能力,允许动态调整信号量的值和行为。这个功能在资源池管理和流量控制场景中特别有用。

4.1 动态调整资源池大小

在实际系统中,资源需求可能会随时间变化。rt_sem_control允许我们动态调整资源池的大小,而无需重新初始化整个系统:

/* 动态调整资源池大小 */
void adjust_resource_pool_size(rt_sem_t sem, int new_size)
{
    int current_size;
    
    // 获取当前信号量值
    rt_sem_control(sem, RT_IPC_CMD_GET_VALUE, &current_size);
    
    if (new_size > current_size) {
        // 需要增加资源数量
        int add_count = new_size - current_size;
        for (int i = 0; i < add_count; i++) {
            rt_sem_release(sem);
        }
    } else if (new_size < current_size) {
        // 需要减少资源数量
        int remove_count = current_size - new_size;
        for (int i = 0; i < remove_count; i++) {
            // 注意:这种方式可能不是原子操作,需要根据具体场景调整
            if (rt_sem_take(sem, 0) != RT_EOK) {
                // 无法立即获取信号量,说明有资源正在使用
                break;
            }
        }
    }
    
    rt_kprintf("Resource pool size adjusted from %d to %d\n", 
               current_size, new_size);
}

注意:减少资源池大小时需要谨慎,确保不会影响正在使用资源的线程。

4.2 监控与诊断

通过rt_sem_control,我们可以实时监控资源使用情况,为系统诊断和优化提供数据支持:

/* 资源使用情况监控 */
typedef struct {
    rt_sem_t sem;
    int max_usage;
    int total_allocations;
} resource_monitor_t;

void* allocate_resource(resource_monitor_t* monitor)
{
    int current_value;
    rt_sem_control(monitor->sem, RT_IPC_CMD_GET_VALUE, &current_value);
    
    // 计算当前使用率
    int usage = get_max_resources() - current_value;
    if (usage > monitor->max_usage) {
        monitor->max_usage = usage;
    }
    
    monitor->total_allocations++;
    
    // 实际分配资源...
    return allocate_actual_resource();
}

这种方法可以帮助我们识别资源使用的峰值模式,从而更好地规划系统容量。

4.3 性能优化技巧

在使用信号量进行资源管理时,一些性能优化技巧可以显著提高系统效率:

  1. 选择合适的等待模式:RT-Thread提供了RT_IPC_FLAG_FIFO和RT_IPC_FLAG_PRIO两种模式,根据场景选择最合适的模式

  2. 避免优先级反转:对于关键资源,考虑使用互斥量的优先级继承特性,或者精心设计线程优先级

  3. 超时机制:为rt_sem_take设置合理的超时时间,避免永久阻塞导致的系统僵局

/* 带超时的资源申请 */
#define RESOURCE_WAIT_TIMEOUT 100  // tick数

rt_err_t try_acquire_resource(rt_sem_t sem)
{
    rt_err_t result = rt_sem_take(sem, RESOURCE_WAIT_TIMEOUT);
    
    if (result == RT_ETIMEOUT) {
        // 超时处理逻辑
        rt_kprintf("Warning: Resource acquisition timeout\n");
        // 可以执行降级操作或返回错误
    }
    
    return result;
}
  1. 批量操作:当需要多个资源单元时,考虑设计支持批量分配的机制,减少信号量操作次数:
/* 批量资源分配 */
rt_err_t acquire_multiple_resources(rt_sem_t sem, int count, rt_tick_t timeout)
{
    for (int i = 0; i < count; i++) {
        rt_err_t result = rt_sem_take(sem, timeout);
        if (result != RT_EOK) {
            // 失败时释放已获取的资源
            for (int j = 0; j < i; j++) {
                rt_sem_release(sem);
            }
            return result;
        }
    }
    return RT_EOK;
}

在实际项目中,我曾经遇到一个需要管理多个外设访问的系统,最初使用简单的互斥量导致性能瓶颈,后来改用信号量资源池模式后,系统吞吐量提升了40%以上,同时还获得了更好的可预测性和更简单的资源管理逻辑。

RT-Thread学习笔记六——线程间通讯(信号量的使用) RT-Thread中信号量函数接口API详解,以及实际使用。 阅读详情

相关推荐

当拿到金葡菌的全基因组测序数据后该怎样进行分析呢

很多做科研实验/做课题报告的科研老师们在拿到全基因组测序数据之后要进行一系列的分析,但同时也担心数据庞大分析缓慢导致进度,也有因为不会编程不知道该如何进行拼接分析的...其实需要质控拼接、MLST分析及菌种鉴定等完全可以自己在平台上进行分析,下面以金葡菌为例进行了质控拼接及菌种鉴定等分析。 网络图片(侵删) 金黄色葡萄球菌(Staphylococcus aureus,S. aureus)也称“金葡菌”,隶属于葡萄球菌 属,是革兰氏阳性菌的代表,为一种常见的食源性致病微生物。 那么在取得了金葡菌全基

GenesClouds的博客 1962

RT-Thread之rt_sem_control()

** RT-Thread之rt_sem_control() ** rt_err_t rt_sem_control(rt_sem_t sem, int cmd, void *arg) rt_sem_release释放信号量后会将挂起在sem_ack上的线程唤醒并重新调度,rt_sem_control是有可能等下次该线程运行时才会被执行的。在rt_sem_release后使用rt_sem_control的目的是因为在某些应用中必须rt_sem_take和rt_sem_release依次出现,而不允许rt_se

THEXIAO1996的博客 3065

黑马Java第二阶段:JavaWeb(笔记)

黑马Java第二阶段:JavaWeb(笔记)

chen的博客 5632

RT-Thread任务间同步及通信

在多实时任务操作系统中,一项工作的完成往往可以通过多个任务协调的方式共同来完成。例如,一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送显示,如下图两个线程间的数据传递如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它。这将引起数据一致性的问题,例如在显示线程显示数据之前,,传感器线程还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的迷惑。

qq_43460068的博客 1350

用R语言做WGCNA分析全步骤一(附代码解读)【转载】

代码逐句分析一、文章来源二、基因共表达网络构建及模块识别1.数据导入、清洗及预处理2.检查过度缺失值和离群样本3.聚类做离群样本检测4.载入临床特征数据三、自动构建网络及识别模块1.确定合适的软阈值:网络拓扑分析2.一步构建网络和识别模块 一、文章来源 初学WGCNA,觉得博主的代码写的很不错,但其中很多代码在第一遍看的时候有很多地方不理解,后查阅了很多资料,终于看明白了,于是写了一篇笔记,记录自己的学习心得,有不准确的地方,还望各位大佬们不吝赐教~ 原文链接:WGCNA简明指南 二、基因共表达网络构建及模

qq_43138237的博客 2万+

Unity Shader变体优化实战:从内存削减到打包加速

本文深入探讨了Unity项目中Shader变体数量爆炸导致的打包缓慢、内存占用过高及包体臃肿等问题。核心解决方案是通过精准的Shader变体裁剪,即收集项目实际用到的变体形成“白名单”,并利用IPreprocessShaders接口在打包时剔除无用变体。实战表明,该方法能显著提升打包速度并大幅降低运行时内存。

weixin_29300241的博客 214

IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

二、IPC对象管理 2.1 IPC对象控制块 再回顾下内核对象的派生和继承关系: 前面已经介绍过直接继承自基对象rt_object的定时器对象rt_timer、内存池对象rt_mempool、线程对象rt_thread,下面要介绍线程间的同步与通信,线程间同步对象rt_sem / rt_mutex / rt_event和线程间通信对象rt_mb / rt_mq都直接继承自rt_ipc_objec...

流云 2866

EDA公司(一):Synopsys-- 主要 EDA 工具及其简介

Synopsys 是一家领先的电子设计自动化(EDA)软件公司,提供了一系列全面的产品和服务,旨在支持从概念设计到大规模生产的各个阶段。Synopsys 的 EDA 工具覆盖了芯片设计的各个方面,包括但不限于逻辑综合、静态时序分析、功能验证、物理实现、形式验证、测试插入、电源分析、信号完整性分析等。

MHD0815的博客 3295

RT-Thread信号量实战指南:从原理到调试,嵌入式多线程同步核心

在多任务实时操作系统(RTOS)中,线程同步与互斥是保障系统稳定运行的核心机制。信号量(Semaphore)作为一种基础的同步原语,其原理源于经典的进程间通信(IPC)概念,通过计数器机制管理共享资源的访问权限,有效解决了资源竞争和数据一致性问题。在嵌入式开发领域,信号量的技术价值在于以可控的阻塞/唤醒机制替代低效的忙等待,显著提升CPU利用率和系统实时性。其典型应用场景包括保护临界区、实现生产者-消费者模型以及线程间的事件通知。本文聚焦于RT-Thread实时操作系统,深入剖析信号量的**动态创建与静态初

weixin_30808693的博客 407

从零到一:EHB-电机复合制动系统的Simulink仿真实战指南

本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。

hh234的博客 1004

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

weixin_55249340的博客 3万+

Java高并发系统 + 安全监控 完整知识体系

本文系统梳理了Java高并发开发的全方位知识体系,涵盖单机并发基础、分布式架构、系统安全、监控体系和故障治理等核心模块。主要内容包括: 单机并发基础 CPU多级缓存与内存模型 JMM内存模型与happens-before原则 锁机制与CAS原子操作 并发容器与线程池原理 JVM调优与性能优化 分布式高并发架构 分布式锁与一致性算法 缓存体系与典型问题解决方案 消息队列的削峰填谷 负载均衡与分库分表 微服务通信与流量控制 生产级解决方案 高并发业务安全防护 全链路监控体系搭建 典型故障排查与治理 应急预案与性

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 571

【干货分享】高通 SA8295P PCB 设计规范指南

高通SA8295P芯片是第四代骁龙汽车数字座舱平台的核心组件,采用5nm工艺,集成高性能CPU/GPU和30TOPS算力的NPU。文章详细介绍了该芯片各接口的layout设计规范,包括USB3.1/2.0、eDP/DP、MIPI CSI/DSI、PCIe Gen3等接口的阻抗、损耗、延时等关键指标要求,为新能源汽车电子设计提供重要参考。

一只豌豆象的博客 250

RT-Thread学习笔记——信号量

前言 本文讲RT-Thread的线程间同步之信号量,包括为什么要进行线程间同步、信号量创建与删除、信号量获取与释放以及基于STM32的二值信号量示例和计算型信号量示例,采用RTT&正点原子联合出品潘多拉开发板进行实验。 一、线程间同步 1、什么是线程间同步? 同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序,也可以说是在线程之间通过...

Sanjay_Wu的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

内核7-线程间同步

信号量控制块 信号量控制块是操作系统用于管理信号量的一个数据结构,由结构体 structrt_semaphore 表示。另外一种 C 表达方式 rt_sem_t,表示的是信号量的句柄,在 C 语言中的实现是指向信号量控制块的指针。 rt_semaphore 对象从 rt_ipc_object 中派生,由 IPC 容器所管理,信号量的最大值是 65535。 struct rt_object { char name[RT_NAME_MAX]; /*

qq_37932504的博客 2268

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RT_thread 2(线程同步)

c复制代码 rt_err_t rt_sem_control(rt_sem_t sem, int cmd, void *arg);==rt_sem_t ==是 RT-Thread 操作系统中用于表示信号量的类型。⽤于获取信号量(P 操作),线程会尝试获取信号量,如果信号量的计数值为 0,线程会进⼊等待状态,直到信号量被释放或超时。邮箱就像是⼀个固定容量的。

nyasw的博客 1460

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RT-Thread信号量与互斥信号量对比分析

互斥量用于严格互斥访问共享资源,支持。)表示可用资源数量。

每一个commit hash都是时光的指纹。当我用git blame查看旧代码,那些褪色的注释如同泛黄日记 537

[嵌入式系统-16]:RT-Thread -2- 主要功能功能组件详解与API函数说明、API参考手册入口

RT-Thread 提供了一个灵活且易用的设备驱动框架,用于开发和管理各种硬件设备的驱动。该框架旨在简化设备驱动的开发流程,提高设备驱动的可复用性和可移植性。以下是 RT-Thread 设备驱动框架的一些重要概念和组件:设备结构体(struct device):RT-Thread 设备驱动框架使用结构体来表示设备。设备结构体包含了设备的名称、类型、状态等信息,并通过函数指针提供了设备操作的接口函数。设备驱动注册(rt_device_register):设备驱动注册是将设备与设备驱动程序关联起来的过程。

文火冰糖(王文兵)的博客 3040

基于RT_Thread开发STM32之信号量

信号量获取,从创建的信号量资源中获取一个信号量,获取成功返回正确。当线程获取信号量失败时,线程将进入阻塞态,系统 将线程挂到该信号量的阻塞列表中。二值信号量的运作机制:创建二值信号量,为创建的信号量对象分配内存,并把可用信号量初始化为用户自定义的个数, 二值信号量的最大可用信号量个数为 1。概念:信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种 只有 0 和 1 两种情况的信号量称之为二值信号量。(1)信号量(Semaphore)是一种实现线程间通信的机制,实现。

qq_51510500的博客 367

[嵌入式系统-20]:RT-Thread -6- 内核组件编程接口 - 线程编与线程间同步、互斥:信号量、互斥锁

RT-Thread 是一个开源的嵌入式实时操作系统(RTOS),它提供了丰富的 API 接口来支持多任务、线程通信和同步机制等。在 RT-Thread 中,信号量(Semaphore)是一种常用的同步机制,用于控制任务对共享资源的访问。RT-Thread 的信号量是通过rt_sem:用于初始化信号量,可以指定初始值。:用于获取信号量资源。如果信号量值大于 0,则减 1 并继续执行;如果信号量值等于 0,则当前任务会被阻塞,直到其他任务释放信号量资源。:用于释放信号量资源,并唤醒等待的任务。

文火冰糖(王文兵)的博客 1855

RT-Thread线程间同步

在两个或多个线程会操作到同一个临界区资源的时候,会导致竞态的产生,需要通过线程间同步来避免出现错误,同步的方法有很多种,常使用信号量、互斥量(互斥锁)、事件集等。

m0_66099106的博客 463

RT-Thread 信号量(学习笔记)

本文参考自[野火EmbedFire]《RT-Thread内核实现与应用开发实战——基于STM32》,仅作为个人学习笔记。更详细的内容和步骤请查看原文(可到野火资料下载中心下载)

Super辉sir的博客 3142

rt-thread学习之路第五章——线程间同步

线程间同步 在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 “默契” 协作才能使这项工作无差错执行?下面举个例子说明。 例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: 如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数据一致性的问题。例如,在显示线程试图显示数据之前,接收线程还未完成数据的写入,那么显示

weixin_43554326的博客 944

RT_Thread学习笔记_2、线程通信IPC、生产者消费者问题(数据合理通信)

一、线程间通信IPC 嵌入式运行的代码主要是线程和中断(ISR),在运行的过程里有不同的需求: 同步:按照预先的先后次序运行 互斥:一个时刻只允许一个线程访问资源 交换数据 操作系统实现需求的相关机制IPC:信号量、互斥量、事件、邮箱、消息队列 信号量:信号量是一个内核对象 线程通过获取或释放信号量达到同步或互斥的目的。 工作机制:类似于停车场看门大爷,至少需要记录...

qq_39125908的博客 436

【RT-Thread】信号量

信号量是一种同步机制,常用于控制访问某些有限资源

hallo的博客 697

RT-Thread--线程间同步--信号量 by:米醋电子工作室

当任务释放资源时,信号量的计数值增加。信号量可以理解为电影院的座位数(资源数量),当所有座位都满了,新的观众(线程)就需要等待前面的观众离开(释放资源)才能进入。(1)获取信号量(rt_sem_take):当资源可用时,线程可以获取信号量,信号量的值减1。(1)一个系统有多个任务需要访问一个有限的资源池(如线程池,内存池),信号量可以表示可用资源的数量,确保任务只能在资源可用时进行访问。(2)释放信号量(rt_sem_release):使用完资源后,线程释放信号量,信号量的值加1,允许其他线程访问资源。

weixin_73770305的博客 2005
上一篇: 从 Verilog 到比特流:VTR 如何打破 FPGA 工具链的黑盒垄断?
下一篇: 从LPC到SMBUS:嵌入式控制器(EC)如何成为硬件世界的‘隐形交通指挥’
water
博客等级 码龄27年 1310粉丝 2486原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值