У меня есть сервер чата в C/Linux с использованием сокетов TCP. При использовании libev я могу создать ev_io watcher для чтения событий один раз для сокета. Что-то вроде:Libev - обратные вызовы ввода-вывода
ev_io* new_watcher = (ev_io*)malloc(sizeof(ev_io));
//initialize the watcher
ev_init(new_watcher, read_cb);
//set the fd and event to fire on write
ev_io_set(new_watcher, watcher->fd, EV_READ);
//start watching
ev_io_start(loop, new_watcher);
, и это работает отлично, потому что событие чтения будет срабатывать только при наличии данных для чтения. Тем не менее, я должен обрабатывать записи событий по-разному, потому что они постоянно стреляют, даже когда у меня нет данных для записи. Чтобы решить эту проблему, у меня есть read_callback, создающий ev_io watcher для записи данных только тогда, когда есть данные, готовые к записи, а затем write_callback удалит наблюдателя после его отправки.
Это означает, что я выделяю, инициализацию, настройку, просмотр, разблокировку и освобождение наблюдателя записи каждый раз, когда мне нужно обрабатывать сообщение. Я беспокоюсь, что, возможно, это неправильно и неэффективно.
Каков наилучший метод обработки событий write_callback в libev?
Заранее спасибо.