libeventのタイマー
1秒後にcallback2が,2秒後にcallback1が呼ばれるようにしたが,callback2が先に呼ばれ何らかの重い処理をした場合,callback2の途中でcallback1が呼ばれるなんて事はない.
例示すると,
0. タイマーセット:1秒後→callback2,2秒後callback1. 1. callback2のイベント発生.callback2が呼ばれる. 2. callback1のイベント発生 3. 4. callback2の処理が終了.callback2が終了する.callback1が呼ばれる. 5. callback1の処理が終了.
となる.スレッドとかだと,排他処理が必要でよくわからなくなるが,そんなことにはならなそう.
コードはこんな風になる.
#include <sys/time.h> #include <event.h> #include <iostream> void callback1(int fd, short event, void *arg) { sleep(1); std::cout << "timed out 1" << std::endl; } void callback2(int fd, short event, void *arg) { sleep(3); std::cout << "timed out 2" << std::endl; } int main(int argc, char* argv[]) { event evinfo1, evinfo2; timeval tval1, tval2; tval1.tv_sec = 2; tval1.tv_usec = 0; tval2.tv_sec = 1; tval2.tv_usec = 0; event_init(); evtimer_set(&evinfo1, callback1, NULL); evtimer_add(&evinfo1, &tval1); evtimer_set(&evinfo2, callback2, NULL); evtimer_add(&evinfo2, &tval2); event_dispatch(); sleep(10); std::cout << "finish" << std::endl; return 0; }
出力
timed out 2 timed out 1 finish