現在、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 年タイムアウトを使用したくないということです。したがって、これがユーザー トリガー イベントの正しい使用方法でない場合は、その方法を知りたいと思います。