同步是程序中的一个常见困扰,虽然常见,但不见得都能合适的处理,也就有了性能和健壮性的差异。
一般的理解,同步意味着“性能损失”,我们希望能稍微改善一下这个观点,这种“性能”可能指的是实验室的性能,只具有参考价值,没有实际应用意义。
什么是实际意义?解决具体问题的应用,标称XXXGB/s的指标,能在实际中真正落地,并稳定工作才有参考价值。实际应用中的指标往往和标称值有数量级的差异,这是难以避免的,应用千差万别。所以,在应用稳定前不要过多谈及指标,性能。
理想情况下,大家都希望活在一个自己的世界里,顺序执行,周而往复。很不幸的是,这种程序只能存在于教科书上,实际应用中往往需要和其他人的沟通和协调,沟通就是同步。
下面我们来分析一个具体的案例
状态切换过程的同步
- 应用程序有IDLE/CALCEND等几个状态
- IDLE表示空闲
-
CALCEND表示计算结束
大致的转换过程是这样的
还是很复杂的
会产生什么样的问题
- 状态的切换过程不是原子操作
- 状态切换没有及时进行,也就是没有在指定的指令下进行立即切换
具体地
- 如果在计算CALCEND中再次下发数据
- 下发的数据并没有及时处理切换状态
- 状态仍旧是CALCEND
- 如果这时来查询状态,就区分不开是之前的END还是已经END
怎么改?
- 同步查询动作,即返回的数值一定是之前的设置生效后的数值
- 对于这个应用在END中,收到数据就需要立即进入CALCLING
- 强制从END回到IDLE,即必须经历IDLE->CALCING->CALCEND的过程