libevent多執行緒

2021-06-20 23:34:56 字數 3719 閱讀 1398

功能:

主線程同時監聽定時器事件和io事件,工作執行緒簡單的監聽io事件。

主線程每隔一秒種嚮工作執行緒傳送一條字串資訊

工作執行緒顯示該資訊並回顯給主線程

該示例演示了主線程如何同時監聽多個事件。

makefile

eventtest : eventtest.c

gcc -wall -g -levent -lpthread -o eventtest eventtest.c

.phony : clean

clean :

rm eventtest -f

eventtest.c

#include 

#include 

#include 

#include 

#include 

#include 

#include 

struct event_base *workerbase;

int fd[2]

;static void 

thread_libevent_process(

int fd, short which, void *arg)

sleep(1)

;write(fd, buf, ret)

;return;

}static void *

worker_thread(void *arg)

static void

main_event_process(

int fd, short which, void *arg)

return;

}static void

timeout_cb(

int fdd, short event, void *arg)

intmain (

int argc, char *argv)

workerbase = event_init();

if(workerbase =

=null

)ret = socketpair(af_local, sock_stream, 0, fd);if

(ret =

=-1)

event_set(

&ev, fd[0]

, ev_read | ev_persist, main_event_process,

null);

event_base_set(base,

&ev)

;event_add(

&ev, 0)

;evtimer_set(

&evtimeout, timeout_cb,

&evtimeout)

;event_base_set(base,

&evtimeout)

;evutil_timerclear(

&tv)

;tv.tv_sec = 1;

event_add(

&evtimeout,

&tv)

;ret = pthread_create(

&tid,

null

, worker_thread,

(void *

)&fd[1]);

if(ret !

= 0)

event_base_loop(base, 0)

;return 0;}

libevent帶負載均衡的多執行緒使用示例

功能:主線程根據負載工作執行緒負載均衡演算法,每隔一秒鐘向特定的工作執行緒傳送一條字串資訊,工作執行緒簡單的把字串資訊開啟出來。

makefile

eventtest : eventtest.c

gcc -wall -g -levent -lpthread -o eventtest eventtest.c

.phony : clean

clean :

rm eventtest -f

eventtest.c

#include 

#include 

#include 

#include 

#include 

#include 

#include 

typedef struct libevent_thread;

typedef struct dispatcher_thread;

const

int thread_num = 10;

libevent_thread *threads;

dispatcher_thread dispatcher_thread;

int last_thread = 0;

static void

thread_libevent_process(

int fd, short which, void *arg)

ret = read(fd, buf, 128);if

(ret > 0)

return;

}static void *

worker_thread(void *arg)

static void

timeout_cb(

int fd, short event, void *arg)

intmain (

int argc, char *argv)

dispatcher_thread.tid = pthread_self();

threads = calloc(thread_num, sizeof(libevent_thread));

if(threads =

=null

)for

(i = 0; i < thread_num; i++)

threads[i]

.read_fd = fd[1]

;threads[i]

.write_fd = fd[0]

;threads[i]

.base = event_init();

if(threads[i]

.base =

=null

)event_set(

&threads[i]

.event, threads[i]

.read_fd, ev_read | ev_persist, thread_libevent_process,

&threads[i]);

event_base_set(threads[i]

.base,

&threads[i]

.event);if

(event_add(

&threads[i]

.event, 0)==

-1)}

for(i = 0; i < thread_num; i++)

evtimer_set(

&timeout, timeout_cb,

&timeout)

;event_base_set(dispatcher_thread.base,

&timeout)

;evutil_timerclear(

&tv)

;tv.tv_sec = 1;

event_add(

&timeout,

&tv)

;event_base_loop(dispatcher_thread.base, 0)

;return 0;

}

libevent 簡單例子,包括乙個socket的

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...

libevent實現多執行緒

一線程的初始化 1執行緒物件 在進行事件驅動時,每個執行緒需建立自己的事件根基。由於libevent未提供執行緒之間通訊的方式,我們採用管道來進行執行緒的通訊。同時為方便主線程分配執行緒,我們還需保留各個執行緒的id號。因此我們採用如下結構來保留每個執行緒的有關資訊。typedef struct l...

記乙個多執行緒使用libevent的問題

前段時間使用libevent網路庫實現了乙個遊戲伺服器引擎,在此記錄下其中遇到的乙個問題。我在設計伺服器上選擇把邏輯和網路分執行緒,執行緒之間通訊使用佇列。但是這樣做會有個問題 當邏輯執行緒想要主動的發乙個資料報的時候,網路執行緒此時可能還阻塞在等待網路io的系統呼叫上 比如說epoll 如果不做特...