2012-02-05 191 views
1

我有幾個關於libevent2及其多線程支持的問題。Libevent多線程支持

libevent是否支持多線程? 我想實現的是這樣的:

  1. 在單個線程中創建一個event_base。
    • 在這個單線程設置事件並將它們關聯到事件庫。還爲每個觀察到的事件註冊回調。
  2. 只要觀察到的事件發生,就在其他(worker)線程中執行已註冊的回調。

是否可以像libevent一樣做s.th?還是有其他方法來支持多核?

非常感謝你

+0

我想在做類似的事情的(http://stackoverflow.com/問題/ 21677154/libevent-multithreading-to-handle-http-keep-alive-connections)所以我想知道你是怎麼做到的?它運作了嗎?有沒有陷阱?任何反饋將是最受歡迎的! – SlappyTheFish 2014-04-02 09:04:43

回答

7

你需要一些線程池的支持。自2.0.x起,Libevent目前沒有內置這些​​內容,但它可能在將來。

有幾個你可能想要研究的提議擴展。 Mark Ellzey有一個名爲「libevthr」的庫,他在libevhtp中用於線程池。你可以找到it in the libevhtp repository。 Mark Heily有一個建議的補丁來添加一個EV_PARALLEL標誌讓Libevent使用libpthread_workqueue。 It appeared on the libevent-users mailing list here.

如果這些都不適合您,您可以通過選擇您喜歡的任何工作隊列實現並編寫一個Libevent回調以自動將實際回調排隊到另一個線程來完成。

+1

嘿,尼克,如果我添加evthread_use_pthreads();我的代碼我收到錯誤:未定義的引用'evthread_use_pthreads' 編譯我使用以下命令:「gcc chat.c -o聊天-levent -lpthread」,我想,我需要鏈接其他東西,但我沒有知道什麼。你能幫我嗎?謝謝。 – 2012-03-12 17:00:56

7

如果添加evthread_use_pthreads();您必須-levent_pthreads

例子:

gcc chat.c -o chat -levent -lpthread -levent_threads 

和:

$> ls /usr/lib/libevent*.a 
/usr/lib/libevent.a /usr/lib/libevent_core.a /usr/lib/libevent_extra.a /usr/lib/libevent_openssl.a /usr/lib/libevent_pthreads.a