linux libevent-多线程使用bufferevent,解决多线程调用bufferevent_write方法后消息发送不出去的问题

1 篇文章 0 订阅
1 篇文章 0 订阅

转载请注明出处:https://blog.csdn.net/shang3583091/article/details/109056835

 

最近在使用libevent的时候发现多线程调用bufferevent_write的时,在一段时间后经常会发送不出数据。后来在研究发现是默认情况下bufferevent是在主线程中使用的,多线程调用时线程不安全。

解决问题如下:

(1)直接添加“BEV_OPT_THREADSAFE”后创建bufferevent不成功问题

(2)添加evthread_use_pthreads()方法后编译时提示:“evthread_use_pthreads 未定义的引用”的问题

(3)多线程调用发送消息后经常出现发现不出数据的问题

具体解决方法如下:

1:准备工作

在我的cmake文件中需要添加“-levent_pthreads”选项,不然会报“evthread_use_pthreads 未定义的引用”,然后在代码中添加“#include <event2/thread.h>”的引用

2:添加evthread_use_pthreads方法

添加下面的方法,linux中调用“evthread_use_pthreads”,windows中会调用“evthread_use_windows_threads”

#ifdef WIN32

    evthread_use_windows_threads();//win上设置

  #else

    evthread_use_pthreads();//unix上设置

  #endif

注意:一定要在“event_base_new”之前添加此方法!

3:添加“BEV_OPT_THREADSAFE”选项

此选项会自动为bufferevent分配锁,这样就可以安全地在多个线程中使用bufferevent。

代码如下:

bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE|BEV_OPT_THREADSAFE);

完成以上三步后即可解决问题!

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
libevent是一个高效的事件通知库,可以用于多线程环境下的事件驱动编程。下面介绍一下libevent多线程中的使用方法: 1. 创建event_base对象 在多线程环境下,每个线程需要创建一个event_base对象来管理其事件。可以使用event_base_new函数来创建event_base对象。 2. 创建事件 可以使用event_new函数来创建事件。需要指定事件类型、事件触发方式、事件处理函数等参数。 3. 注册事件 在创建事件之后,需要将事件注册到event_base对象上。可以使用event_add函数将事件添加到event_base对象中。 4. 事件循环 在多线程环境下,每个线程需要运行自己的事件循环。可以使用event_base_loop函数启动事件循环。该函数会一直阻塞,直到事件被触发或者事件循环被停止。 5. 停止事件循环 可以使用event_base_loopbreak函数停止事件循环。该函数会唤醒正在阻塞的事件循环,并使其退出。 6. 销毁event_base对象 在使用event_base对象之后,需要调用event_base_free函数来销毁对象。该函数会释放对象占用的内存。 总之,libevent多线程环境下的使用需要注意以下几点: 1. 每个线程需要创建自己的event_base对象。 2. 在创建事件时,需要保证事件的处理函数是线程安全的。 3. 在注册事件时,需要将事件添加到正确的event_base对象中。 4. 在事件循环中,需要处理好线程间的同步问题。 5. 在退出程序时,需要销毁所有的event_base对象。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值