9.8 Forward Progress

For an agent to make forward progress is for it to perform an evaluation step according to this specification.

An agent becomes blocked when its running execution context waits synchronously and indefinitely for an external event. Only agents whose Agent Record's [[CanBlock]] property is true can become blocked in this sense. An unblocked agent is one that is not blocked.

Implementations must ensure that:

  • every unblocked agent with a dedicated executing thread eventually makes forward progress
  • in a set of agents that share an executing thread, one agent eventually makes forward progress
  • an agent does not cause another agent to become blocked except via explicit APIs that provide blocking.

This, along with the liveness guarantee in the memory model, ensures that all SeqCst writes eventually become observable to all agents.