В настоящее время я пишу многопоточное приложение с использованием libevent.
Некоторые события инициируются IO, но мне нужна пара событий, которые запускаются между потоками самим кодом, используя event_active ().
Я попытался написать простую программу, которая показывает, где моя проблема:
Событие создается с помощью event_new (), а для fd установлено значение -1.
При вызове event_add (), если используется структура тайм-аута, событие позднее корректно обрабатывается event_base_dispatch.
Если вместо этого используется event_add (ev, NULL), он возвращает 0 (очевидно, успешно), но event_base_dispatch () возвращает 1 (что означает, что событие не было зарегистрировано должным образом).
Это поведение может быть протестировано с использованием следующего кода и перестановки строк event_add:
#include <event2/event.h>
#include <unistd.h>
void cb_func (evutil_socket_t fd, short flags, void * _param) {
puts("Callback function called!");
}
void run_base_with_ticks(struct event_base *base)
{
struct timeval one_sec;
one_sec.tv_sec = 1;
one_sec.tv_usec = 0;
struct event * ev1;
ev1 = event_new(base, -1, EV_PERSIST, cb_func, NULL);
//int result = event_add(ev1, NULL);
int result = event_add(ev1, &one_sec);
printf("event_add result: %d\n",result);
while (1) {
result = event_base_dispatch(base);
if (result == 1) {
printf("Failed: event considered as not pending dispite successful event_add\n");
sleep(1);
} else {
puts("Tick");
}
}
}
int main () {
struct event_base *base = event_base_new();
run_base_with_ticks(base);
return 0;
}
Компиляция: g ++ sample.cc -levent
Дело в том, что мне не нужен тайм-аут, и я не хочу использовать n-летний тайм-аут в качестве обходного пути. Поэтому, если это неправильный способ использования событий, инициируемых пользователем, я хотел бы знать, как это делается.