Mutexes have a lot to do - they have all the event information contained within them (instead of in a separate event control block), control how things queue waiting for the mutex, ensure things queue in priority order, implement priority inheritance, allow blocking on mutex receives, etc. If you need all that, then use a mutex, if you don’t and your usage scenario is more simply, then you can implement something more simply, even some sort of protected shared variable might do.