1. 程式人生 > >libevent多執行緒

libevent多執行緒

功能: 主執行緒同時監聽定時器事件和IO事件,工作執行緒簡單的監聽IO事件。 主執行緒每隔一秒種向工作執行緒傳送一條字串資訊 工作執行緒顯示該資訊並回顯給主執行緒 該示例演示了主執行緒如何同時監聽多個事件。 Makefile
  1. eventtest : eventtest.c
  2. gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
  3. .PHONY : clean
  4. clean :
  5. rm eventtest -f
eventtest.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <
    event.h>
  8. struct event_base *workerbase;
  9. int fd[2];
  10. static void 
  11. thread_libevent_process(int fd, short which, void *arg)
  12. {
  13.     int ret;
  14.     char buf[128];
  15.     ret = read(fd, buf, 128);
  16.     if (ret > 0) {
  17.         buf[ret] = '\0';
  18.         printf("thread receive message : %s\n", buf);
  19.     }
  20.     sleep(
    1);
  21.     write(fd, buf, ret);
  22.     return;
  23. }
  24. static void *
  25. worker_thread(void *arg)
  26. {
  27.     int fd = *(int *)arg;
  28.     struct event ev;
  29.     event_set(&ev, fd, EV_READ | EV_PERSIST, thread_libevent_process, NULL);
  30.     event_base_set(workerbase, &ev);
  31.     event_add(&ev, 0);
  32.     event_base_loop(workerbase,
     0);
  33.     return NULL;
  34. }
  35. static void
  36. main_event_process(int fd, short which, void *arg)
  37. {
  38.     int ret;
  39.     char buf[128];
  40.     ret = read(fd, buf, 128);
  41.     if (ret > 0) {
  42.         buf[ret]='\0';
  43.         printf("main thread receive echo message : %s\n", buf);
  44.     }
  45.     return;
  46. }
  47. static void
  48. timeout_cb(int fdd, short event, void *arg)
  49. {
  50.     struct timeval tv;
  51.     struct event *timeout = arg;
  52.     write(fd[0], "Hello world!", sizeof("Hello world!") - 1);
  53.     evutil_timerclear(&tv);
  54.     tv.tv_sec = 1;
  55.     event_add(timeout, &tv);
  56. }
  57. int
  58. main (int argc, char *argv[])
  59. {
  60.     int ret;
  61.     pthread_t tid;
  62.     struct event ev;
  63.     struct event evtimeout;
  64.     struct timeval tv;
  65.     struct event_base *base;
  66.     base = event_init();
  67.     if (base == NULL) {
  68.         perror("event_init( base )");
  69.         return 1;
  70.     }
  71.     workerbase = event_init();
  72.     if (workerbase == NULL) {
  73.         perror("event_init( workerbase )");
  74.         return 1;
  75.     }
  76.     ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
  77.     if (ret == -1) {
  78.         perror("socketpair() : ");
  79.         return 1;
  80.     }
  81.     event_set(&ev, fd[0], EV_READ | EV_PERSIST, main_event_process, NULL);
  82.     event_base_set(base, &ev);
  83.     event_add(&ev, 0);
  84.     evtimer_set(&evtimeout, timeout_cb, &evtimeout);
  85.     event_base_set(base, &evtimeout);
  86.     evutil_timerclear(&tv);
  87.     tv.tv_sec = 1;
  88.     event_add(&evtimeout, &tv);
  89.     ret = pthread_create(&tid, NULL, worker_thread, (void *)&fd[1]);
  90.     if (ret != 0) {
  91.         perror("pthread_create()");
  92.         return 1;
  93.     }
  94.     event_base_loop(base, 0);
  95.     return 0;
  96. }