Назначение кодировки Псевдокод - PullRequest
0 голосов
/ 28 марта 2020

это открытый вопрос, учитывая, что событие вызывается только один раз, и несколько потоков могут регистрировать обратные вызовы, и все они запускаются после того, как событие произошло, обратите внимание на обратные вызовы, пытающиеся зарегистрироваться после того, как событие должно сработать немедленно. Как предотвратить состояние гонки / все обратные вызовы, вызываемые правильно. Что вы, ребята, думаете?

Register(func){

  if(flag == true){
       call func;
  }

  mutex lock

  push  the callbacks in queue

  mutex un_lock

}

even_fired(){

   mutex lock

   execute the function in the queue
   notify flag
   mutex un_lock
}

1 Ответ

0 голосов
/ 29 марта 2020
...
  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, что также приведет к пропуску вашего обратного вызова. В прикладных языках расхождение становится шире. Вам необходимо явно удалить условие гонки по отношению к языку, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...