为什么epoll是线程安全的而libevent却不是?
epoll线程安全但libevent默认线程不安全的核心原因
- 首先要明确epoll的线程安全边界:
epoll_ctl、epoll_wait这类系统调用的线程安全,是内核层面为epoll实例的红黑树、就绪链表等内核态数据结构加了并发保护,仅保证多线程同时调用这些系统调用不会出现内核态的数据异常,不会干涉上层用户态代码的线程安全逻辑。 - libevent默认线程不安全的根源是它的核心结构
event_base的用户态数据默认没有加锁保护:event_base内部维护了已注册事件链表、定时事件小根堆、信号事件队列、就绪事件列表等大量用户态状态数据,多线程同时操作event_base(比如一个线程调用event_add注册事件,另一个线程跑event_base_loop事件循环)时,会直接出现用户态的数据竞争,哪怕底层调用的epoll接口本身是安全的,也会出现逻辑错误、程序崩溃。 - 补充说明:libevent并非完全不支持线程安全,你可以在初始化
event_base前调用evthread_use_pthreads(Linux平台)接口开启线程安全模式,开启后libevent会自动给所有操作event_base的逻辑加互斥锁,即可实现多线程安全调用。默认关闭线程安全是为了兼顾单线程使用场景的性能,避免不必要的锁开销。
内容的提问来源于stack exchange,提问作者steamgjk
相关产品推荐
相关产品推荐

