«Управляемый событиями» означает, что приложение «сидит там», ожидая событий, которые приведут в движение то, что происходит дальше. Типичные события - это различные формы действий мыши или клавиатуры.
Напротив, «управляемый процессом» (часто «процедурное программирование») просто означает, что есть программа, «следящая» за вещами, постоянно работающая с тем, что она должна делать.
Вы МОЖЕТЕ кодировать оба одновременно, но это «сложное упражнение» - или, по крайней мере, некоторые так думают.
Теперь, большая проблема условий гонки - это действительно вопрос о том, что может произойти запутывание. С базами данных, вот отличный пример: если вы кодируете свой статус ошибки возврата в глобальном переменном и есть ЛЮБОЕ временное перекрытие между действиями в вашем коде (часто это происходит в средах, управляемых событиями, но может происходить и в чисто процедурном программировании), вы может получить неправильное сообщение об ошибке. Представьте, что у потока, который вызвал что-то, была ошибка, и у более быстрого потока не было ошибки, но более быстрый поток появился позже и установил статус в успех; есть условие, которого «поточно-ориентированное» программирование избежало бы. Это всего лишь один пример «состояния гонки».
До тех пор, пока действия каждого потока независимы, у вас самих нет условий гонки - все зависит от логики приложения и его потребностей - и никто здесь не может сказать вам, кем они могут быть, только разработчик! ... Это система бронирования авиабилетов? ...