Я смотрю на 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:
- Возможно ли, что
ev_break
сломает конструктор ev_run
in myclass
? - Если я отправлю
async.send
из другого потока, будет async_cb
запустить в потоке, откуда был вызван send
, или в потоке, в котором зацикливается ev_run
?
В конце концов, главный вопрос: это хорошая практика - разбивать и запускать ev_run в асинхронном обратном вызове c, если я хочу дождаться другого (не асин c) события (или я буду использовать флаги или другие методы)?