状态机中的阻塞系统调用是调用事件吗

Is a Blocking System Call in a State Machine a Call Event

在 UML 状态机中的状态之间的转换中,您可以有一个触发器、一个守卫和一个效果。

如果我执行阻塞系统调用(例如 Posix 系统上的 select() 或 Raspberry Pi 上的 wait_for_edge())这是一个调用事件因为状态机被阻塞,我不能继续这个操作?

我可以用这种方式为这个状态机建模,还是必须使用不同的机制?

谢谢

如果您有阻塞调用,状态将保持不变。您将在状态内显示 <<do>> 操作等调用。

状态机内的阻塞调用违反了普遍假定的 运行-to-completion 状态机内事件处理的语义。这是因为解除阻塞(来自阻塞调用的return)是将事件传递给状态机的另一种方式。问题是这个 "back-door" 事件到达时状态机已经在处理原始事件。此外,没有明确的方式在状态机图中显示此类 "un-blocking" 事件。由于这些原因,在状态机或任何真正的事件驱动系统内都应避免任何阻塞调用(甚至不包括内联 delay())。事件应严格通过事件循环传递。这样的事件循环可以阻塞以等待事件,但这是任何状态机之外。