libevent多线程
来源:互联网 发布:北京网络推广公司排名 编辑:程序博客网 时间:2024/05/16 01:16
功能:
主线程同时监听定时器事件和IO事件,工作线程简单的监听IO事件。
主线程每隔一秒种向工作线程发送一条字符串信息
工作线程显示该信息并回显给主线程
该示例演示了主线程如何同时监听多个事件。
Makefile
- eventtest : eventtest.c
- gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
- .PHONY : clean
- clean :
- rm eventtest -f
eventtest.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <event.h>
- struct event_base *workerbase;
- int fd[2];
- static void
- thread_libevent_process(int fd, short which, void *arg)
- {
- int ret;
- char buf[128];
- ret = read(fd, buf, 128);
- if (ret > 0) {
- buf[ret] = '\0';
- printf("thread receive message : %s\n", buf);
- }
- sleep(1);
- write(fd, buf, ret);
- return;
- }
- static void *
- worker_thread(void *arg)
- {
- int fd = *(int *)arg;
- struct event ev;
- event_set(&ev, fd, EV_READ | EV_PERSIST, thread_libevent_process, NULL);
- event_base_set(workerbase, &ev);
- event_add(&ev, 0);
- event_base_loop(workerbase, 0);
- return NULL;
- }
- static void
- main_event_process(int fd, short which, void *arg)
- {
- int ret;
- char buf[128];
- ret = read(fd, buf, 128);
- if (ret > 0) {
- buf[ret]='\0';
- printf("main thread receive echo message : %s\n", buf);
- }
-
- return;
- }
- static void
- timeout_cb(int fdd, short event, void *arg)
- {
- struct timeval tv;
- struct event *timeout = arg;
- write(fd[0], "Hello world!", sizeof("Hello world!") - 1);
- evutil_timerclear(&tv);
- tv.tv_sec = 1;
- event_add(timeout, &tv);
- }
- int
- main (int argc, char *argv[])
- {
- int ret;
- pthread_t tid;
- struct event ev;
- struct event evtimeout;
- struct timeval tv;
- struct event_base *base;
- base = event_init();
- if (base == NULL) {
- perror("event_init( base )");
- return 1;
- }
- workerbase = event_init();
- if (workerbase == NULL) {
- perror("event_init( workerbase )");
- return 1;
- }
- ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
- if (ret == -1) {
- perror("socketpair() : ");
- return 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) {
- perror("pthread_create()");
- return 1;
- }
- event_base_loop(base, 0);
- return 0;
- }
0 0
- libevent 多线程
- libevent多线程
- libevent多线程
- libevent多线程
- libevent多线程
- libevent多线程编程
- libevent多线程使用事项
- libevent多线程使用事项
- libevent 多线程调用event_base
- libevent多线程编程实例
- libevent多线程服务器
- libevent多线程服务器2
- libevent 多线程例子
- 多线程中使用libevent
- libevent多线程使用事项
- Libevent 使用多线程
- libevent实现多线程
- libevent多线程使用事项
- 如何使用 docker 及常用命令(一)
- hbase-0.96.1.1-cdh5.0.0-beta2中BaseRegionObserver对应的coprocessor部署
- Codeforces Round #198 (Div. 2) / 340B Maximal Area Quadrilateral (点集中的最大四边形)
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次
- realVNC才是正统
- libevent多线程
- [Storm 0.8.2]: java.io.FileNotFoundException: File '../stormconf.ser' does not exist
- 发了一篇文章,怎么列表中看不到呢?
- 浙大PAT 1022. D进制的A+B (解题思路)
- js预编译解析执行过程分析
- linux下mysql的root密码忘记解决方法
- Source Insight如何改变背景颜色
- Java设计模式之观察者模式
- Installing Oracle 11gR2 on Ubuntu 12.04