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

rongxiaojun 2014-01-24 03:15:04
现在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操作事件,应该不会有问题?

希望有明确知道的告诉我,这里到底会不会有问题,会有什么问题?为了把问题描述清楚有点啰唆哈,见谅
...全文
326 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sniffer12345 2014-02-11
  • 打赏
  • 举报
回复
引用 7 楼 rongxiaojun 的回复:
[quote=引用 5 楼 buyong 的回复:] libevent支持多线程编程,每个事件需要关联到自己的event_base。
event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。 线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?[/quote] 人家都是单线程的,你非得按多线程去写,要么你加锁,要么你就必须要彼此隔离。 你得创建多个loop,这个loop相当于一个context,每个线程维护自己的loop
buyong 2014-02-11
  • 打赏
  • 举报
回复
libevent支持多线程编程,每个事件需要关联到自己的event_base。
craboy1 2014-02-11
  • 打赏
  • 举报
回复
友情帮顶!!!!
rongxiaojun 2014-02-11
  • 打赏
  • 举报
回复
顶一下 顶上去
rongxiaojun 2014-02-11
  • 打赏
  • 举报
回复
引用 5 楼 buyong 的回复:
libevent支持多线程编程,每个事件需要关联到自己的event_base。
event_base的循环运行于线程1,即event_base_loop(base)在线程1中跑。 线程2通过bufferevent_socket_new(base,.....)向线程1中的base注册事件,线程安全吗?
rongxiaojun 2014-02-11
  • 打赏
  • 举报
回复
引用 4 楼 craboy1 的回复:
友情帮顶!!!!
谢谢
rongxiaojun 2014-02-10
  • 打赏
  • 举报
回复
libevent没人知道吗
rongxiaojun 2014-02-10
  • 打赏
  • 举报
回复
SOS 看过来

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧