libev - правильно ли вызывать ev_run из обратного вызова наблюдателя? - PullRequest
0 голосов
/ 31 марта 2020

Я смотрю на libev ( github ), то есть

Полнофункциональное и высокопроизводительное событие l oop, которое слабо смоделирован после libevent, но без ограничений и ошибок.

Теперь я не нашел никакой информации (может быть там) об этом:

Правильно ли это звонить ev_run в обратном вызове наблюдателя?

class myclass
{
  struct ev_loop* loop;
  ev::async async;

  void async_cb(ev::async &w, int revents) {
    ev_break (EV_A_ EVBREAK_ALL); //1. is it possible this will break ev_run in the ctr?
    ev_run(loop,0);
  }

  void exitloop() { // this can be called from a different thread!
    async.send();
  }

  myclass ()
  {
    loop = ev_loop_new(0);
    async.set<myclass, &myclass::io_async> (this);
    async.set(loop);    // configure the watcher
    async.start();      // start it whenever convenient
    ev_run(loop,0);
  }
};

Я пробовал это, и оно работает.

Однако мне не ясно, могут ли быть условия гонки, ie:

  1. Возможно ли, что ev_break сломает конструктор ev_run in myclass?
  2. Если я отправлю async.send из другого потока, будет async_cb запустить в потоке, откуда был вызван send, или в потоке, в котором зацикливается ev_run?

В конце концов, главный вопрос: это хорошая практика - разбивать и запускать ev_run в асинхронном обратном вызове c, если я хочу дождаться другого (не асин c) события (или я буду использовать флаги или другие методы)?

...