Hi! Snap! doesn't have truly asynchronous threads; scheduling happens only when a thread deliberately yields, which it does at the bottom of the looping primitives and at explicit WAIT blocks. (There are a few other cases, the primitives that are expected to be time-consuming, such as GLIDE.) In particular, a thread is never interrupted between the computation of the test part of an IF and the computation of the chosen action. This pretty much eliminates the need for mutexes. If you want to teach about synchronization you'll have to simulate asynchronous events by saying, for example,
(The above isn't actually quite true. If a thread runs for a really long time, the Snap! scheduler will force-yield it, so that you can recover from infinite loops in your code.)