libevent源码分析之多线程准备工作

libevent中是默认不开启多线程的,也就没有什么锁, 条件变量等的说法了
我们可以使用evthread_use_pthreads()开启linux下的pthread

#ifdef WIN32
int evthread_use_windows_threads(void);
#define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED
#endif
#ifdef _EVENT_HAVE_PTHREADS
int evthread_use_pthreads(void);
#define EVTHREAD_USE_PTHREADS_IMPLEMENTED
#endif

或者使用evthread_set_lock_callbacks定制属于自己的多线程, 锁, 条件变量等

libevent是如何封装多线程的呢, 还需要从下面这个结构体说起:


这是对某种线程的锁的一些操作封装:


struct evthread_lock_callbacks {
    /** The current version of the locking API.  Set this to
     * EVTHREAD_LOCK_API_VERSION */
        /**/
    int lock_api_version;
    /** Which kinds of locks does this version of the locking API
     * support?  A bitfield of EVTHREAD_LOCKTYPE_RECURSIVE and
     * EVTHREAD_LOCKTYPE_READWRITE.
     *
     * (Note that RECURSIVE locks are currently mandatory, and
     * READWRITE locks are not currently used.)
     **/
    unsigned supported_locktypes;

        //初始化锁
    void *(*alloc)(unsigned locktype);

        //释放锁
    void (*free)(void *lock, unsigned locktype);

    int (*lock)(unsigned mode, void *lock);

    int (*unlock)(unsigned mode, void *lock);
};

根据官方给出的文档, 支持的锁类型有:
普通的非递归锁                                               0
递归锁, 即本线程可以多次对某锁进行lock而不会进入死锁          EVTHREAD_LOCKTYPE_RECURSIVE
读写锁                                   EVTHREAD_LOCKTYPE_READWRITE

支持的锁mode有:
EVTHREAD_READ , EVTHREAD_WRITE ,  EVTHREAD_TRY


以上是封装的线程锁, 下面是封装的线程条件变量:
struct evthread_condition_callbacks {
    int condition_api_version;

    void *(*alloc_condition)(unsigned condtype);

    void (*free_condition)(void *cond);

    int (*signal_condition)(void *cond, int broadcast);

    int (*wait_condition)(void *cond, void *lock,
        const struct timeval *timeout);
};

因为对于条件变量的包装类似, 所以这里略过



如何与libeven相结合的呢?

文章顶部提到, 我们可以使用evthread_use_pthreads来开启linux下的pthread:
int
evthread_use_pthreads(void)
{
    struct evthread_lock_callbacks cbs = {
        EVTHREAD_LOCK_API_VERSION,
        EVTHREAD_LOCKTYPE_RECURSIVE,
        evthread_posix_lock_alloc,    
        evthread_posix_lock_free,
        evthread_posix_lock,
        evthread_posix_unlock
    };
    struct evthread_condition_callbacks cond_cbs = {
        EVTHREAD_CONDITION_API_VERSION,
        evthread_posix_cond_alloc,
        evthread_posix_cond_free,
        evthread_posix_cond_signal,
        evthread_posix_cond_wait
    };
    /* Set ourselves up to get recursive locks. */
        //以下为初始化递归锁的属性,attr_recursive是全局变量, 该属性对象是在初始化一个锁的时候使用的
        //虽然我们的默认锁的名字叫EVTHREAD_LOCKTYPE_RECURSIVE,但真正让它称为递归锁还是要靠这个属性而不是单纯的名字就行...
    if (pthread_mutexattr_init(&attr_recursi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
luotuo44是一个GitHub上的开源项目,其主要目的是分析libevent源码libevent是一个使用C语言编写的事件驱动库,可以用于开发高性能的网络服务器和客户端应用程序。 在分析libevent源码时,luotuo44首先研究了libevent的基本结构和使用方法。他深入研究了libevent的事件循环机制、事件触发方式以及事件回调函数的实现原理。通过仔细阅读源代码,他详细解释了libevent是如何利用系统底层的IO多路复用技术(如select、epoll等)来实现高效的事件处理。 此外,luotuo44还分析libevent的缓冲区管理和事件优先级处理机制。他对libevent的缓冲区数据结构和操作进行了详细解读,包括如何实现缓冲区的读写以及缓冲区事件的触发和处理。他还深入探讨了libevent的事件优先级机制,介绍了如何设置和管理不同优先级的事件,并解释了事件优先级对事件处理效率的影响。 除了基本功能外,luotuo44还分析libevent的线程安全性和性能优化策略。他详细讲解了libevent的线程安全机制,包括互斥锁、条件变量等,并提供了一些最佳实践指南,以确保多线程环境下的稳定性和性能。此外,他还分享了一些他自己的性能优化经验,包括使用合适的数据结构、避免频繁内存分配与释放等。 总的来说,luotuo44的libevent源码分析为那些想深入了解libevent内部原理和如何正确使用libevent的开发者提供了很大的帮助。通过他的分析,读者可以更好地理解libevent工作原理,并从中学习到一些编程技巧和优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值