libevent(一)

来源:互联网 发布:劝人学医天打雷劈知乎 编辑:程序博客网 时间:2024/05/22 04:55

Libevent 是一个基于事件通知机制的网络库,用来开发可扩展性的网络服务器。
Libevent提供了一种机制,可以在指定事件发生于某文件描述符或者一个超时事件到达的时候执行一个回调函数。进一步,Libevent也支持信号触发的回调。Libevent用来替换目前的基于事件驱动的网络服务器中的事件循环。应用程序只需要调用event_dispatch(),然后动态增加或移除事件,而不用修改事件循环。目前,Libevent支持/dev/poll, kqueue(2), select(2), poll(2), epoll(4), and evports

     内部事件机制完全独立于暴露的外部接口,因此当Libevent需要更新时,不需要重新设计外部应用程序。因此,Libevent提供了跨平台的开发能力。Libevent支持多线程程序。

Libevent可以在Linux, *BSD, Mac OS X, Solaris and, Windows编译。每个使用Libevent的程序必须包含<event2/event.h>,传递-levent给链接器。 在你调用Libevent的函数前,你需要安装这个库。如果你要在多线程程序中使用Libevent,你需要初始化多线程支持--调用evthread_use_pthreads() or evthread_use_windows_threads()See <event2/thread.h> for more information.你可以替换Libevent的内存管理函数,通过event_set_mem_functions函数,用event_enable_debug_mode()开启debug模式。接下来,你需要创建一个event_base 结构,使用event_base_new() or event_base_new_with_config()event_base用来管理哪些事件被监测,哪些事件被激活。每个event只能和一个event_base相联系。对于每个你要监视的文件描述符,你必须用event_new创建一个event结构体。你也可以声明一个event结构体然后用event_assign初始化结构体。要使通知生效,你要用event_add把该结构体加入监控列表。

event结构体必须在他活跃状态一直存在,因此一般需要在堆上分配。
最后,你可以使用event_base_dispatch去循环处理事件。你也可以使用event_base_loop() 去做更灵活的控制,比如用非阻塞的方式去调用loop
另外,一个event_base在同一时间只能被一个线程dispatching。如果你想在多个线程使用events,有2种办法:
1you can either have a single event_base whose events add work to a work queue
2,你可以给每个线程创建一个event_base对象