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