ecos中的spl同步机制
API
常见api
- splimp
- splnet
- splclock
- splsoftnet
- 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同步机制相关推荐
- 游戏中的网络同步机制——Lockstep(转载)
原文转自http://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep 0 ...
- 游戏中的网络同步机制(一)帧同步Lockstep
转载自:https://www.jianshu.com/p/64b3f162dcf4 参考游戏中的网络同步机制--Lockstep 一.前言 每个人或多或少都接触过网游,那个虚拟的世界给予了我们无穷的 ...
- 大白话总结类《王者荣耀》等MOBA游戏中的网络同步机制
案例游戏: <英雄联盟> <王者荣耀>等PVP游戏 实际解决方案: 同步机制:不锁步的帧同步 网络:传输层的UDP配合应用层的可靠性检验 以下从问题出发讨论解决方案. 主要问题 ...
- Linux中的线程同步机制-futex
Linux中的线程同步机制(一) -- Futex 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这 ...
- 游戏中的网络同步机制——Lockstep(帧同步)
本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...
- 游戏中的网络同步机制(二) 王者荣耀对帧同步的应用
转载自:https://www.jianshu.com/p/81050871cce7 参考 解密:腾讯如何打造一款实时对战手游 从<王者荣耀>来聊聊游戏的帧同步 <王者荣耀>技 ...
- android fence机制,Android中的GraphicBuffer同步机制-Fence
Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...
- cpld xilinx 定义全局时钟_AutoSAR中的时钟同步机制
Fig 1 AutoSar CP中的时间同步部分主要由Stbm,TimeSyncOverEth和底层的以太网模块组成. 底层的以太网模块主要负责收发报文和时间戳. 如果系统设计决定使用网卡NIC的时钟 ...
- java中的线程同步机制讲解
文章目录 锁 锁的概述 锁的作用 保证原子性 保证可见性 保证有序性 锁的分类 内部锁 synchronized 概念 原理 使用 可重入性 显示锁 使用 内存屏障 概念 分类 按可见性划分 按有序性 ...
最新文章
- 数据可视化工具zeppelin安装
- 在Linux系统下安装gnuplot遇到的问题
- 暑假集训考试反思+其它乱写
- Linux实验室阿里云证书,开发者云体验实验室
- Java 导入导出Excle表格 两种方式
- 不知道用什么图表展示数据?看这份图表选择指南就够了
- CentOS6.X安装QQ2012
- 修改的梅花雪的日期控件。。只是一些小改动
- Openstack+Kubernetes+Docker微服务实践之路--基础设施
- Mac vscode花屏问题解决
- 读《微波工程(第三版)》笔记 (9:传输线模型)
- Unity 官方教程2
- 中英文电子书下载:https://sobooks.cc/
- 计算机用户最高权限,win7系统开启用户最高管理权限的方法
- 性能优化,进无止境---CPU篇
- 【文献笔记】【精读】Near-Ultrasound Communication for TV’s 2nd Screen Services
- 一些版本管理常用的文档链接
- python中pytest教程_Pytest安装新手详细教程
- window10 win10 查看本机IP
- OWC生成统计报表(柱形图)