漫谈程序中的同步

同步是程序中的一个常见困扰,虽然常见,但不见得都能合适的处理,也就有了性能和健壮性的差异。
一般的理解,同步意味着“性能损失”,我们希望能稍微改善一下这个观点,这种“性能”可能指的是实验室的性能,只具有参考价值,没有实际应用意义。
什么是实际意义?解决具体问题的应用,标称XXXGB/s的指标,能在实际中真正落地,并稳定工作才有参考价值。实际应用中的指标往往和标称值有数量级的差异,这是难以避免的,应用千差万别。所以,在应用稳定前不要过多谈及指标,性能。
理想情况下,大家都希望活在一个自己的世界里,顺序执行,周而往复。很不幸的是,这种程序只能存在于教科书上,实际应用中往往需要和其他人的沟通和协调,沟通就是同步。

下面我们来分析一个具体的案例

状态切换过程的同步

  • 应用程序有IDLE/CALCEND等几个状态
  • IDLE表示空闲
  • CALCEND表示计算结束
    大致的转换过程是这样的


    漫谈程序中的同步_第1张图片
    image.png

    还是很复杂的

会产生什么样的问题

  • 状态的切换过程不是原子操作
  • 状态切换没有及时进行,也就是没有在指定的指令下进行立即切换

具体地

  • 如果在计算CALCEND中再次下发数据
  • 下发的数据并没有及时处理切换状态
  • 状态仍旧是CALCEND
  • 如果这时来查询状态,就区分不开是之前的END还是已经END

怎么改?

  • 同步查询动作,即返回的数值一定是之前的设置生效后的数值
    • 对于这个应用在END中,收到数据就需要立即进入CALCLING
  • 强制从END回到IDLE,即必须经历IDLE->CALCING->CALCEND的过程

你可能感兴趣的:(漫谈程序中的同步)