libevent源码分析--锁和多线程

本文分析libevent-2.0.20-stable的源码,探讨其在多线程环境下的锁和同步机制。libevent提供了锁和条件变量以确保线程安全,支持普通锁、递归锁和读写锁。用户可通过evthread_use_pthreads()等函数自定义线程锁操作。同时,libevent还具备锁调试功能,用于检测常见的锁使用错误。
摘要由CSDN通过智能技术生成
写在前面:

​ 这个源码是分析libevent-2.0.20-stable, 并非最新版本的libevent,作者并没有全看源码,在这里会推荐以下参考的一些网站,也欢迎大家在不足的地方提出来进行讨论。

libevent源码分析

libevent深度剖析1

libevent深度剖析2

​ libevent的内部实现不需要多线程,为此我们在libevent的源码中也看不到有关线程的接口。但是我们很有可能在某个多线程程序中使用libevent,那么就需要保证线程共享的结构体是线程安全的,为此libevent提供了锁和条件变量来确保线程的同步。

​ libevent的结构体在多线程下通常有三种方式:

  • 某些结构体只能使用在单线程:同时在多个线程中使用它们总是不安全的。

  • 某些结构具有可选择的锁: 可以告知libevent是否需要在多个线程中使用每个对象。

  • 某些结构体总是锁定的:如果libevent在支持锁的配置下运行,在多线程中使用它们总是安全的。

 

如果想要开启多线程模式,需要调用eventhread_use_pthreads()函数

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. */
    if (pthread_mutexattr_init(&attr_recursive))
        return -1;
    if (pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE))
        return -1;
​
    evthread_set_lock_callbacks(&cbs);
    evthread_set_condition_callbacks(&cond_cbs);
    evthread_set_id_callback(evthread_posix_get_id);
    return 0;
}

​ 接下来我们就针对这个函数,自顶向下看看源码的实现,首先我们来看看锁回调结构体的实现

struct evthread_lock_callbacks {
    int lock_api_version;
    //版本号,默认设置为宏EVTHREAD_LOCK_API_VERSION
    unsigned supported_locktypes;
    //支持的锁类型,有普通锁,递归锁,读写锁三种
    
    //分配一个锁变量(指针类型),因为不同的平台锁变量是不同的类型
    //所以用这个通用的void*类型
    void *(*alloc)(unsigned locktype);  
    void (*free)(void *lock, unsigned locktype);  
    int (*lock)(unsigned mode, void *lock);     
    int (*unlock)(unsigned mode, void *lock);
};

​ 第一个元素是api_version,但是似乎在libevent中,都只有一个版本被宏定义成了1

#define EVTHR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值