...
if(flag == true){
call func;
}
<<< what happens if the event fires here? >>>
mutex lock
push the callbacks in queue
mutex un_lock
...
Чтобы решить подобные проблемы, вы должны смотреть в каждый момент времени, когда событие может произойти, и определять, будет ли ваш механизм его обрабатывать. Важная характеристика c «каждого момента времени» заключается в том, что утверждения даже в таких языках, как C, не обязательно являются атомарными; код:
if (flag == true) {
может стать:
load flag, %r0
cmp $0, %r0
je 1f
Таким образом, event_fired () может произойти между инструкцией load и cmp, что также приведет к пропуску вашего обратного вызова. В прикладных языках расхождение становится шире. Вам необходимо явно удалить условие гонки по отношению к языку, который вы используете.