m-locking m-waiting t-Locking t-Waiting t-Setting t-Signalling # look ma, nobody received my signal! t-Locking t-Waiting # and now we're both blocked, waiting for the other to call or (I reconstructed this second scenario from memory) m-processing t-Locking t-Waiting t-Signalling # if a tree signals in a forest, and noone's listening t-Locking t-Waiting m-locking m-waiting # and again, we both wait... #### If there are no threads blocked in a "cond_wait" on the variable, the signal is discarded. By always locking before signaling, you can (with care), avoid signaling before another thread has entered cond_wait().