libevent是单线程的,为了充分利用多CPU,想在程序执行时根据cpu个数创建多个线程。
server功能很简单:client发起链接,client发送请求,server处理请求,server发送应答。
因为各个client的request互不关联,所以想在线程创建的时候设置执行函数,所有线程都作如下步骤:
1.struct event_base *base = event_base_new();//每个线程都维护一个event_base
2.设置struct sockaddr_in sin;//地址端口都设置好
3.struct evconnlistener *listener = evconnlistener_new_bind(base,acceptcb,NULL,LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE,-1,(struct sockaddr*)&sin,sizeof(sin));//分配监听socket和bind、设置非阻塞、设置callback
4.然后在连接到来,进入acceptcb时为其创建struct bufferevent再加入线程自己的event_base
问题来了,不可能多个线程同时bind和listen同一个地址端口(bind肯定是不行,listen我也不确定?)
于是想改成:
1.主线程:设置struct sockaddr_in sin;//地址端口都设置好
2.主线程:struct evconnlistener *listener = evconnlistener_new_bind(base,acceptcb,NULL,LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE,-1,(struct sockaddr*)&sin,sizeof(sin));//分配监听socket和bind、设置非阻塞、设置callback
3.主线程:为先到来的连接分配struct bufferevent 只是轮流将其注册到各个线程的event_base上。
struct bufferevent *bufev = bufferevent_socket_new(base[i],fd,BEV_OPT_CLOSE_ON_FREE);
为bufev设置回调函数:bufferevent_setcb
最后激活事件:bufferevent_enable(bufev,EV_READ|EV_WRITE);
但是问题又来了:主线程通过bufferevent_socket_new向线程i的base[i]里注册bufferevent,线程i在base[i]上event_base_dispatch(base[i]) 这里会不会产生问题?一开始我认为,两个线程操作同一个base[i]应该有问题的,后来一想,主线程只是用bufferevent_socket_new向其中加入事件,线程i操作事件,应该不会有问题?
希望有明确知道的告诉我,这里到底会不会有问题,会有什么问题?为了把问题描述清楚有点啰唆哈,见谅
8 个解决方案
#1
SOS
看过来
看过来
#2
libevent没人知道吗
#3
顶一下 顶上去
#4
友情帮顶!!!!
#5
libevent支持多线程编程,每个事件需要关联到自己的event_base。
#6
谢谢
#7
event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?
#8
人家都是单线程的,你非得按多线程去写,要么你加锁,要么你就必须要彼此隔离。
你得创建多个loop,这个loop相当于一个context,每个线程维护自己的loop
#1
SOS
看过来
看过来
#2
libevent没人知道吗
#3
顶一下 顶上去
#4
友情帮顶!!!!
#5
libevent支持多线程编程,每个事件需要关联到自己的event_base。
#6
友情帮顶!!!!
谢谢
#7
libevent支持多线程编程,每个事件需要关联到自己的event_base。
event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?
#8
libevent支持多线程编程,每个事件需要关联到自己的event_base。
event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?
人家都是单线程的,你非得按多线程去写,要么你加锁,要么你就必须要彼此隔离。
你得创建多个loop,这个loop相当于一个context,每个线程维护自己的loop