API

常见api

  1. splimp
  2. splnet
  3. splclock
  4. splsoftnet
  5. splx

虽然看到有好几种形式,但实际上splimp,splnet,splclock,splsoftnet都是调用的splany

常见使用方法

一般在ecos的网络层见到,典型用法如下:

#define  MBUFLOCK(code) do {                     \int _ms = splimp();                       \\{ code }                          \splx(_ms);                         \
} while (0)

先调用splimp(),中间是临界区代码,然后执行splx(x)。

代码分析

splx

先来看解锁的部分

void
cyg_splx(cyg_uint32 old_state SPLXMOREARGS)
{SPLXTRACE;CYG_ASSERT( 0 != spl_state, "No state set" );CYG_ASSERT( splx_mutex.locked, "splx: mutex not locked" );CYG_ASSERT( (cyg_handle_t)splx_mutex.owner == cyg_thread_self(),"splx: mutex not mine" );cyg_scheduler_lock();spl_state &= old_state;if ( 0 == spl_state ){splx_thread = 0;cyg_mutex_unlock( &splx_mutex );}cyg_scheduler_unlock();
}

splany

第一次进来,程序流程很简单,就是修改spl_state的值为which,spl_thread为自身,加上splx_mutex互斥锁,返回0.
没有调splx的情况下相同线程第二次进来,什么都不做,返回which。
没有调splx的情况下不同线程第二次进来,将会卡在互斥锁上。
没有递归调splany的情况下,splx执行完spl_state=0,释放互斥锁。
递归调用splany的情况下,前几次的splx由于spl_state都不为0,,不会有实际动作,最后一次splx才会释放互斥锁

static inline cyg_uint32
spl_any( cyg_uint32 which )
{cyg_uint32 old_spl = spl_state;int lock_stat = 0;if (splx_thread == NULL){cyg_scheduler_lock();lock_stat = 1;}if ( cyg_thread_self() != splx_thread ){while ( !cyg_mutex_lock( &splx_mutex ) )continue;if (lock_stat == 0){cyg_scheduler_lock();lock_stat = 1;}old_spl = 0; // Free when we unlock this contextCYG_ASSERT( 0 == splx_thread, "Thread still owned" );CYG_ASSERT( 0 == spl_state, "spl still set" );splx_thread = cyg_thread_self();}CYG_ASSERT( splx_mutex.locked, "spl_any: mutex not locked" );CYG_ASSERT( (cyg_handle_t)splx_mutex.owner == cyg_thread_self(),"spl_any: mutex not mine" );spl_state |= which;if (lock_stat == 1)cyg_scheduler_unlock();return old_spl;
}

总结

spl这套同步机制实质上就是互斥锁机制,只是相比较下,互斥锁不支持递归调用,而spl支持递归调用。spl使用起来也更加方便。

ecos中的spl同步机制相关推荐

  1. 游戏中的网络同步机制——Lockstep(转载)

    原文转自http://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep 0 ...

  2. 游戏中的网络同步机制(一)帧同步Lockstep

    转载自:https://www.jianshu.com/p/64b3f162dcf4 参考游戏中的网络同步机制--Lockstep 一.前言 每个人或多或少都接触过网游,那个虚拟的世界给予了我们无穷的 ...

  3. 大白话总结类《王者荣耀》等MOBA游戏中的网络同步机制

    案例游戏: <英雄联盟> <王者荣耀>等PVP游戏 实际解决方案: 同步机制:不锁步的帧同步 网络:传输层的UDP配合应用层的可靠性检验 以下从问题出发讨论解决方案. 主要问题 ...

  4. Linux中的线程同步机制-futex

    Linux中的线程同步机制(一) -- Futex 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这 ...

  5. 游戏中的网络同步机制——Lockstep(帧同步)

    本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...

  6. 游戏中的网络同步机制(二) 王者荣耀对帧同步的应用

    转载自:https://www.jianshu.com/p/81050871cce7 参考 解密:腾讯如何打造一款实时对战手游 从<王者荣耀>来聊聊游戏的帧同步 <王者荣耀>技 ...

  7. android fence机制,Android中的GraphicBuffer同步机制-Fence

    Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...

  8. cpld xilinx 定义全局时钟_AutoSAR中的时钟同步机制

    Fig 1 AutoSar CP中的时间同步部分主要由Stbm,TimeSyncOverEth和底层的以太网模块组成. 底层的以太网模块主要负责收发报文和时间戳. 如果系统设计决定使用网卡NIC的时钟 ...

  9. java中的线程同步机制讲解

    文章目录 锁 锁的概述 锁的作用 保证原子性 保证可见性 保证有序性 锁的分类 内部锁 synchronized 概念 原理 使用 可重入性 显示锁 使用 内存屏障 概念 分类 按可见性划分 按有序性 ...

最新文章

  1. 数据可视化工具zeppelin安装
  2. 在Linux系统下安装gnuplot遇到的问题
  3. 暑假集训考试反思+其它乱写
  4. Linux实验室阿里云证书,开发者云体验实验室
  5. Java 导入导出Excle表格 两种方式
  6. 不知道用什么图表展示数据?看这份图表选择指南就够了
  7. CentOS6.X安装QQ2012
  8. 修改的梅花雪的日期控件。。只是一些小改动
  9. Openstack+Kubernetes+Docker微服务实践之路--基础设施
  10. Mac vscode花屏问题解决
  11. 读《微波工程(第三版)》笔记 (9:传输线模型)
  12. Unity 官方教程2
  13. 中英文电子书下载:https://sobooks.cc/
  14. 计算机用户最高权限,win7系统开启用户最高管理权限的方法
  15. 性能优化,进无止境---CPU篇
  16. 【文献笔记】【精读】Near-Ultrasound Communication for TV’s 2nd Screen Services
  17. 一些版本管理常用的文档链接
  18. python中pytest教程_Pytest安装新手详细教程
  19. window10 win10 查看本机IP
  20. OWC生成统计报表(柱形图)

热门文章

  1. 4.9_bridge_结构型模式:桥模式
  2. can总线配置读入是什么意思_CAN总线基础知识学习笔记
  3. 【面向对象】第三单元总结——JML
  4. mysql5.7安装
  5. 第一百七十四天 how can i 坚持
  6. node.js服务端代码学习
  7. LeetCode(884)——两句话中的不常见单词(JavaScript)
  8. 【Vue2.0】—mixin混入 (十五)
  9. JavaScript学习(八十二)—JavaScript的组成
  10. JavaScript学习(三十七)—实现右键自定义菜单的功能