Libevent(三)
建立一個event_base
每個event_base儲存一堆event,而且可以測驗出哪些events是激活了的
如果一個event_base是設定為用了鎖,那麼就是執行緒安全的。然而,如果你有很多個執行緒要進行IO操作,那麼對於每個執行緒都需要建立一個event_base
每一個event_base都有一個工具,這些工具是:
** selectpollepollkqueuedevpoll evportwin32**
你也可以關閉某個特定的工具,例如 kqueue,通過設定EVENT_NOKQUEUE環境變數關閉。如果想要在程式裡關閉,可以用event_config_avoid_method
建立一個預設的event_base
event_base_new()函式從堆分配一個預設event_base物件,返回一個event_base的指標,出錯返回NULL
介面
struct event_base* event_base_new(void);
建立一個複雜的event_base
event_config是一個儲存特定event_base資訊的結構體。如果要特定的event_base,將event_config傳給函式event_base_new_with_config()
介面
struct event_config* event_config_new(void); struct event_base* event_base_new_with_config(const struct event_config* cfg); void event_config_free(struct event_config* cfg);
用event_config_new()去分配一個新的event_config物件,通過呼叫其他函式去設定event_config,用event_config_free去回收物件。
介面
int event_config_avoid_method(struct event_config* cfg, const char* method); enum event_method_feature { EV_FEATURE_ET = 0x01, EV_FEATURE_O1 = 0x02, EV_FEATURE_FDS = 0x04, }; int event_config_require_features(struct event_config *cfg, enum event_method_feature feature); enum event_base_config_flag { EVENT_BASE_FLAG_NOLOCK = 0x01, EVENT_BASE_FLAG_IGNORE_ENV = 0x02, EVENT_BASE_FLAG_STARTUP_IOCP = 0x04, EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10, EVENT_BASE_FLAG_PRECISE_TIMER = 0x20 }; int event_config_set_flag(struct event_config *cfg, enum event_base_config_flag flag);
直接通過字串名稱呼叫event_config_avoid_method()可以讓Libevent不去用特指的工具。通過event_config_require_feature()告訴Libevent不去使用不能提供特指一系列特點的工具。event_config_set_flag設定一些標籤。
EV_FEATURE_ET:
需要工具支援邊緣觸發IO
EV_FEATURE_O1
需要工具支援插入刪除啟用event的複雜度是O(1)
EV_FEATURE_FDS
需要工具提供各種檔案描述符,而不只是套接字。
EVENT_BASE_FLAG_NOLOCK
不給此event_base設定執行緒鎖,多執行緒不安全。
示例:建立特定event_base
struct event_config* cfg; struct event_base* base; int i; cfg = event_config_new(); event_config_avoid_method(cfg,"select"); event_config_require_feature(cfg,EV_FEATURE_ET); base = event_base_new_with_config(cfg); event_config_free(cfg);
回收event_base
呼叫函式 void event_base_free(struct event_base* base);
設定優先順序
預設情況下,一個event_base只支援一個優先順序,可以設定多個優先順序通過呼叫介面
int event_base_priority_init(struct event_base* base,int n_priorities);
優先順序引數至少為1,設定後優先順序為0到n_priorities-1。Libevent支援的最高優先順序為EVENT_MAX_PRIORITIES.
要找到當前event_base支援多少優先順序通過呼叫函式
int event_base_get_npriorities(struct event_base* base);
fork後重新啟動event_base
在建立新程序後還要繼續使用之前event_base的話,最好重新初始化
介面:
int event_reinit(struct event_base* base); ....... if(fork()) { continue_running_parent(base); } else { event_reinit(base); continue_running_child(base); }
event_init(void);
早期版本的Libevent庫有個全域性預設event_base,可以被所有執行緒訪問 ,如果繫結在這個預設的event_base上,這是執行緒不安全的。替代event_base_new()的是:
struct event_base* event_init(void);
這個將當前要繫結的base設為分配的base,而不是預設的base。