公众号旧文

当事情没做完,又被打断,会发生什么?——从被打断的生活,到工程里的「可重入」

作者:胖子阅读 —

我发现,人和系统一样, 最容易出问题的时刻,不是在忙,而是在被打断的时候。

你可能也有过这种经历:

  • 正在写一段很重要的消息
  • 电话突然响了
  • 接完电话回来
  • 盯着屏幕半天,不知道刚才写到哪了

有时候你会补一句: “我刚才写到哪了来着?”

工程里,这一瞬间,有一个专门的词来形容: 不可重入。

一、什么叫“可重入”?

如果你直接去查书,可能会看到类似这样的描述:

可重入: 函数在执行过程中被再次调用,仍然能正确运行。

这句话是对的, 但它不太像人话。

我们换一种方式理解。

二、生活里的可重入:你能不能被打断?

想象一个场景:

你正在厨房切菜。

这时:

  • 电话响了
  • 你接起电话
  • 说了两分钟
  • 挂断
  • 回到案板前
  • 继续切菜

如果你能做到:

  • 不切到手
  • 不忘自己切到哪
  • 不把盐当糖撒进去

那你这个“切菜系统”, 就是可重入的。

三、不可重入的人,会发生什么?

再想另一种情况。

你在:

  • 算账
  • 写代码
  • 组织一句很复杂的话

这时有人突然问你一句:

你在干嘛?

你被迫回答, 再回来时发现:

  • 思路断了
  • 状态丢了
  • 甚至要从头来过

这就是不可重入的典型表现。

不是你笨, 而是你当时的系统状态, 没有被妥善保存。

四、工程里为什么这么怕“不可重入”?

因为工程系统, 比人更容易被打断。

  • 中断
  • 多线程
  • 信号
  • 回调
  • 异步事件

它们随时可能在你还没干完的时候插进来。

如果系统是不可重入的, 后果通常不是慢一点,而是:

  • 数据错乱
  • 状态覆盖
  • 直接崩溃

五、一个很真实的工程比喻

假设你在记账:

  1. 先从钱包里拿钱
  2. 再在本子上记一笔

如果在 第 1 步和第 2 步之间, 有人又让你开始一次新的记账:

  • 你可能把钱拿了两次
  • 却只记了一笔账

系统这时候已经不可信了。

可重入的设计,要求的是:

无论你什么时候被打断,状态都要是安全的。

六、为什么“能暂停”的人,通常更稳?

你有没有发现:

  • 有些人可以被随时打断
  • 再回来,马上接上
  • 情绪和思路都很稳定

而有些人:

  • 一被打断就烦
  • 一烦就乱
  • 一乱就出错

这不是性格问题, 而是状态管理能力的差异。

工程里也是一样。

一个可重入的系统,通常意味着:

  • 状态清晰
  • 依赖少
  • 每一步都是安全点

七、为什么工程师喜欢“局部变量”?

这是个很工程的细节, 但背后的直觉非常生活。

  • 全局状态
  • 局部状态

这就像:

  • 把东西随手堆满整张桌子 vs
  • 每做一件事,就用一个托盘装好

托盘多了没关系, 混在一起才是灾难。

八、可重入,其实是在尊重“现实的打断”

我越来越觉得:

可重入这个原则, 并不是假设世界会安静、顺序、听话。

它恰恰承认了一件事:

现实一定会打断你。

  • 电话会响
  • 网络会抖
  • 人会插话
  • 系统会抢占

真正成熟的系统,不是说:

你别打断我。

而是说:

你随时来,我都能接住。

九、把它放回生活里看

如果一个人:

  • 事情做到一半,能安全停下
  • 被打断后,能平稳回来
  • 不依赖“一次性专注到结束”

那这个人, 在某种意义上是高度可重入的。

而这种能力, 无论在工程里,还是生活中, 都极其稀缺。

幂等解决的是:

你重复做了,会不会更糟?

而可重入解决的是:

你还没做完,又被打断了,会不会出事?

它们一个对抗重复, 一个对抗打断, 合在一起, 几乎覆盖了现实世界里最常见的混乱来源。

有时候我会觉得:

好的工程设计, 本质上是在替人类对抗一个 永远不够安静的世界。