In a single-threaded environment, there is usually nothing wrong with processing events right away when they happen.
But in a multi-threaded environment this can lead to race conditions and syncronization issues. For that reason I would recommend you to give each thread an event queue to which other threads can push events. Each thread would lock thatits event queue in a suitable phase of their loop, process the events in the order they were received, and unlock the queue again.
Make sure you use the appropriate synchronization features of your programming language to ensure that pushing on and processing of the event queues is thread-safe.