Вы используете мьютекс, чтобы обеспечить доступ только к одному потоку выполнения. Например, если вы хотите обновить список, который потенциально может использоваться несколькими потоками, вы должны использовать мьютекс:
acquire mutex
update list
release mutex
С мьютексом только один поток может одновременно выполнять "список обновлений".
Вы используете событие ручного сброса, если хотите, чтобы несколько потоков подождали чего-то, прежде чем продолжить. Например, вы запустили несколько потоков, но все они приостановлены, ожидая какого-то другого события, прежде чем они смогут продолжить. Как только это событие произойдет, все потоки могут начать работать.
Основной поток будет выглядеть так:
create event, initial value false (not signaled)
start threads
do some other initialization
signal event
Код каждого потока будет:
do thread initialization
wait for event to be signaled
do thread processing