libevent2.1.3(目前版本) 多线程 请教

时间:2021-10-03 19:16:39
现在14:43 明天开完年会就放假 心沉不下去了 静不下来就真的没办法思考了 看看有没有之前做过的给点意见:

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


引用 4 楼 craboy1 的回复:
友情帮顶!!!!

谢谢

#7


引用 5 楼 buyong 的回复:
libevent支持多线程编程,每个事件需要关联到自己的event_base。

event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?

#8


引用 7 楼 rongxiaojun 的回复:
Quote: 引用 5 楼 buyong 的回复:

libevent支持多线程编程,每个事件需要关联到自己的event_base。

event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?

人家都是单线程的,你非得按多线程去写,要么你加锁,要么你就必须要彼此隔离。
你得创建多个loop,这个loop相当于一个context,每个线程维护自己的loop

#1


SOS
看过来

#2


libevent没人知道吗

#3


顶一下 顶上去

#4


友情帮顶!!!!

#5


libevent支持多线程编程,每个事件需要关联到自己的event_base。

#6


引用 4 楼 craboy1 的回复:
友情帮顶!!!!

谢谢

#7


引用 5 楼 buyong 的回复:
libevent支持多线程编程,每个事件需要关联到自己的event_base。

event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?

#8


引用 7 楼 rongxiaojun 的回复:
Quote: 引用 5 楼 buyong 的回复:

libevent支持多线程编程,每个事件需要关联到自己的event_base。

event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。
线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?

人家都是单线程的,你非得按多线程去写,要么你加锁,要么你就必须要彼此隔离。
你得创建多个loop,这个loop相当于一个context,每个线程维护自己的loop