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

本文深入探讨libevent如何封装多线程,从结构体和锁的操作开始,包括普通系统锁和libevent的debug锁,以及如何通过evthread_set_lock_callbacks函数设置线程相关工具。
摘要由CSDN通过智能技术生成
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值