下面的方式是创建多个event_base来处理多线程的,主event_base用来处理连接请求,各个子event_base用来处理读写和关闭请求。
另一种方式是,所有的连接、读写、断开操作,都在一个event_base里面,然后当读到数据时,放入到子线程中处理,处理完了后再写,不过此时需要读写加锁,参考下列代码中的client_register_cb(...)
// TestServer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "event.lib")
#pragma comment(lib, "event_extra.lib")
#pragma comment(lib, "event_core.lib")
#else
#include <unistd.h>
#include <netinet/in.h>
#include <pthread.h>
# ifdef _XOPEN_SOURCE_EXTENDED
# include <arpa/inet.h>
# endif
#include <sys/socket.h>
#define GetCurrentThreadId() pthread_self()
#endif
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/listener.h>
#include <event2/util.h>
#include <event2/event.h>
#include <event2/thread.h>
static const char MESSAGE[] = "Hello, World!\n";
static const int PORT = 9638;
static void listener_cb(struct evconnlistener *, evutil_socket_t,
struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_readcb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *);
static void signal_cb(evutil_socket_t, short, void *);
static void connlistener_errorcb(struct evconnlistener *, void *);
static bool init_client_dispatch();
int main2(int argc, char **argv)
{
printf("the main thread id: %d\n",GetCurrentThreadId());
struct event_base *base;
struct evconnlistener *listener;
struct event *signal_event;
//其实 event_base_new(); 内部也是这么实现的
struct event_config *cfg = event_config_new();
#ifdef WIN32
WSADATA wsa_data;
WSAStartup(0x0202, &wsa_data);
//告诉libEvent使用Windows自己的线程和同步锁,并启用多线程安全
evthread_use_windows_threads();
//Windows启用IOCP模式
event_config_set_flag(cfg, EVENT_BASE_FLAG_STARTUP_IOCP);
//根据CPU实际数量配置libEvent的CPU数
SYSTEM_INFO si;
GetSystemInfo(&si);
event_confi

本文档展示了一个使用libevent库创建的多线程服务器示例,服务器通过创建多个event_base来处理不同任务,如连接请求、读写和关闭请求。在Windows上使用了IOCP模式,并利用线程安全的bufferevent进行读写操作。客户端连接时,新线程处理读写事件,避免阻塞主线程。同时,还展示了如何处理信号中断和错误回调。
最低0.47元/天 解锁文章

2567

被折叠的 条评论
为什么被折叠?



