一線程的初始化
1執行緒物件
在進行事件驅動時,每個執行緒需建立自己的事件根基。由於libevent未提供執行緒之間通訊的方式,我們採用管道來進行執行緒的通訊。同時為方便主線程分配執行緒,我們還需保留各個執行緒的id號。因此我們採用如下結構來保留每個執行緒的有關資訊。
typedef struct libevent_thread;
2 初始化執行緒
static void setup_thread(libevent_thread *me)
將主線程儲存於結構體的第0個物件中,然後為每個執行緒建立管道並建立事件根基。
threads = malloc(sizeof(libevent_thread) * nthreads);
threads[0].base = main_base;
threads[0].thread_id = pthread_self();
for (i = 0; i < nthreads; i++)
/* 啟用事件根基.*/
static void *worker_libevent(void *arg)
二分發連線
現在我們有了多個執行緒和事件根基,那麼我們應該如何將主線程接收到的連線分發給各個執行緒並將其啟用呢?本例子中線程的選擇採用最簡單的輪詢方式。
thread += 1;
item->sfd = sfd
cq_push(&threads[thread].new_conn_queue, item);
write(threads[thread].notify_send_fd, "", 1)
三處理請求
管道的讀請求就緒後,**函式thread_libevent_process被呼叫,此時就進入到了執行緒中,後面所有的排程都將在該執行緒中進行。
首先從管道中讀取1個位元組,然後建立事件緩衝區物件來實際處理請求。
static void thread_libevent_process(int fd, short which, void *arg)
四結束語
到這裡我們的程式就可以使用執行緒池和libevent事件驅動來協同工作了。在實際的服務中,我們通常要將服務作為守護程序來執行,那麼在linux中,如何編寫守護程序呢?後面在繼續學習如何編寫linux守護程序。
libevent多執行緒
功能 主線程同時監聽定時器事件和io事件,工作執行緒簡單的監聽io事件。主線程每隔一秒種嚮工作執行緒傳送一條字串資訊 工作執行緒顯示該資訊並回顯給主線程 該示例演示了主線程如何同時監聽多個事件。makefile eventtest eventtest.c gcc wall g levent lpth...
libevent多執行緒程式設計
1 建立event base要使用event base new 函式。2 新增事件,按這個順序 evtimer set event set event base set event add 3 執行緒函式裡使用 event base dispatch 4 要退出dispatch迴圈使用event b...
(40)多執行緒 實現多執行緒方法
建立執行緒用法 1.繼承thread,重寫run 方法,建立子類物件 a a new a 執行緒開始執行 a.start 2.實現runnable介面,實現run 方法,建立實現類物件 a a new a 建立 類物件 thread t new thread a 執行緒開始執行 t.start 上面...