功能:
主線程同時監聽定時器事件和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 如果不做特...