ACE笔记(7)-ACE单体实例、原语、锁、条件变量

本文是ACE笔记,介绍了ACE单体实例,其生命周期由ACE机制管理,可通过模板技术生成单体类,还给出获取实例的方法及帮助编译器理解模板的代码。此外,讲解了ACE原语,定义原子动作可避免多线程问题,同时介绍了锁和条件变量的常用类及方法。

ACE笔记(7)-ACE单体实例、原语、锁、条件变量

首先介绍一下ACE单体实例的概念
  所谓单体实例就是一个相当于一个静态全局对象,其生命周期由ACE机制自己管理,所以在main函数中绝对不要调用exit之类的系统底层函数退出主函数,否则会导致这些单体实例不会被释放,默认,ACE会在程序开始时生成一些很常用或者特殊的单体实例

 你也可以通过模板技术生成自己的单体类,如下:
   #include "ace/Auto_Event.h"
   #include "ace/Singleton.h"
   #include "ace/Thread_Manager.h"

   typedef ACE_Singleton <ACE_Auto_Event, ACE_Thread_Mutex> EVENT;
   
 上面代码定义了一个 ACE_Auto_Event 类型的单体类,其锁机制是采用线程互斥机制
 要获得单体类的实例,需调用 instance() 方法,如:
   EVENT::instance ()->wait ()

当然,要使编译器理解这个模板,需要加入如下代码帮助编译器理解它:
  #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
  template class ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>;
  #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
  #pragma instantiate ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>
  #elif defined (__GNUC__) && (defined (_AIX) || defined (__hpux))
  template ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex> *
    ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>::singleton_;
  #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
   
ACE原语:
 可以用如下代码定义一个所操作的的动作是原子动作,例如
 ACE_Atomic_Op<ACE_Thread_Mutex, int> count;   
 上面代码定义了变量count,锁机制采用线程互斥机制,这样的话以后对count变量进行比如++,--的操作就不必考虑多线程的问题了

锁和条件变量:
 锁可以确保资源在某一时刻只被一个线程操作
 条件变量一般需跟锁配合使用
 相关的常用类如下:
  ACE_Thread_Mutex 类:
   acquire(超时设置) 方法:获得锁的使用权,如在指定时间没有获得,返回-1
   release 方法:释放锁的使用权
   acquire_read() 获得锁的读权
   acquire_write() 获得锁的写权
  ACE_Condition_Thread_Mutex 类
   ACE_Condition_Thread_Mutex(锁) :构造一个锁的条件变量
   wait() 等待条件成立
   signal() 发送条件成立信号
   
   
   
   
  
      
  

### SATA协议中的原语(Primitives)概述 SATA协议中定义了18种原语(Primitives),这些原语是用于控制和管理数据传输的基本信号单元。每个原语的格式均为1个双字(DWs),并且其结构具有统一性。在所有原语中,只有ALIGN的首字节为K28.5编码,其他原语则以K28.3作为首字节[^1]。 ### ALIGN原语的特点 ALIGN原语是SATA协议中特有的一个原语,主要用于调整链路两端设备之间的时钟同步。与其它原语不同的是,ALIGN具有中性差异性(neutral disparity),即0和1的数量相等,这使得它可以在不影响极性偏差的情况下被插入到数据流中[^1]。 ### 原语的应用场景 在SATA的数据传输过程中,原语扮演着至关重要的角色,它们不仅用于初始化连接、建立通信链路,还用于维持链路状态以及处理错误情况。例如,在端口复位之后,主机控制器会发送一系列特定的原语来通知设备准备接收数据;而在正常的数据传输期间,则可能需要通过特定的原语来实现流量控制或错误恢复等功能。 ### 完整数据传输过程详解 完整的SATA数据传输流程通常包括以下几个阶段: - **链路初始化**:当物理层连接成功后,双方开始交换配置信息,如速度协商等。 - **命令下发**:主机向设备发送读写命令及相关参数。 - **数据传输**:根据命令执行相应的数据读取或写入操作。 - **状态报告**:完成数据传输后,设备向主机反馈执行结果的状态码。 - **断开连接**:一旦事务处理完毕,任一方都可以发起断开请求以释放资源。 在整个过程中,各种原语被用来标记不同的事件发生,确保双方能够正确理解当前所处的状态并采取相应措施。 ```python # 示例代码:模拟SATA原语发送函数 def send_sata_primitive(primitive_type): """ 模拟发送指定类型的SATA原语 参数: primitive_type (str): 要发送的原语类型名称 返回: None """ # 根据primitive_type构造对应的原始数据包 if primitive_type == 'ALIGN': data = b'\x5C' # ALIGN对应的K28.5编码 elif primitive_type in ['START', 'DATA FIS', ...]: # 假设这里列出了其余所有非ALIGN类型的原语 data = b'\xFC' # 其他类型使用K28.3编码 else: raise ValueError("未知的原语类型") # 实际发送逻辑... print(f"正在发送{primitive_type}原语: {data.hex().upper()}") ``` 以上就是关于SATA协议中原语及其在完整数据传输过程中的应用简介。希望这份笔记能帮助您更好地理解和掌握SATA协议的核心概念之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值