libevent线程池使用代码
时间: 2023-10-24 12:19:13 浏览: 97
代码 libevent 使用
下面是一个简单的libevent线程池使用代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <event2/event.h>
#include <event2/thread.h>
#define THREAD_NUM 4
struct event_base *base;
struct event_config *cfg;
void worker_cb(int fd, short events, void *arg) {
printf("worker thread %lu running\n", pthread_self());
}
void* worker(void *arg) {
struct event_base *worker_base = event_base_new_with_config(cfg);
if (!worker_base) {
perror("event_base_new_with_config failed");
exit(EXIT_FAILURE);
}
printf("worker thread %lu started\n", pthread_self());
event_base_loop(worker_base, EVLOOP_NO_EXIT_ON_EMPTY);
}
int main() {
int i;
pthread_t tid[THREAD_NUM];
// 初始化libevent线程支持
evthread_use_pthreads();
// 创建event配置
cfg = event_config_new();
if (!cfg) {
perror("event_config_new failed");
exit(EXIT_FAILURE);
}
// 设置IO多路复用的后端为epoll
event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL);
// 创建主线程的event base
base = event_base_new_with_config(cfg);
if (!base) {
perror("event_base_new_with_config failed");
exit(EXIT_FAILURE);
}
// 创建线程池
for (i = 0; i < THREAD_NUM; i++) {
if (pthread_create(&tid[i], NULL, worker, NULL)) {
perror("pthread_create failed");
exit(EXIT_FAILURE);
}
}
// 在主线程中添加事件
struct event *ev = event_new(base, STDIN_FILENO, EV_READ | EV_PERSIST, worker_cb, NULL);
event_add(ev, NULL);
// 主线程循环等待事件
event_base_loop(base, EVLOOP_NO_EXIT_ON_EMPTY);
// 等待所有工作线程退出
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(tid[i], NULL);
}
// 释放资源
event_free(ev);
event_base_free(base);
event_config_free(cfg);
return 0;
}
```
该代码会创建一个包含4个工作线程的线程池,主线程会监听标准输入的读事件。当标准输入有数据可读时,主线程会将事件交给线程池中的一个工作线程处理。每个工作线程都会创建自己的event base来处理事件。最后,主线程等待所有工作线程退出后释放资源。
阅读全文