我目前正在使用 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 年超时作为解决方法。因此,如果这不是使用用户触发事件的正确方法,我想知道它是如何完成的。