Libevent源码分析-----多线程、锁、条件变量(一)

Libevent的多线程API在thread.h中,通过evthread_use_windows_threads()或evthread_use_pthreads()开启。用户可定制锁和条件变量,Libevent仅提供接口,不提供直接使用线程的接口。线程安全的函数如event_base_dispatch允许在多线程环境中使用。Libevent的锁结构支持普通、递归和读写锁,但实际支持类型依赖于定制的线程锁。条件变量的实现类似,仅提供一种版本。Libevent封装了Win32和pthreads的线程,但不支持读写锁。
摘要由CSDN通过智能技术生成

        转载请注明出处: http://blog.csdn.net/luotuo44/article/details/38350633



        Libevent提供给用户的可见多线程API都在thread.h文件中。在这个文件提供的API并不多。基本上都是一些定制函数,像前面几篇博文说到的,可以为Libevent定制用户自己的多线程函数。


开启多线程:

        Libevent默认是不开启多线程的,也没有锁、条件变量这些东西。这点和前面博客说到的"没有定制就用Libevent默认提供",有所不同。只有当你调用了evthread_use_windows_threads()或者evthread_use_pthreads()或者调用evthread_set_lock_callbacks函数定制自己的多线程、锁、条件变量才会开启多线程功能。其实,前面的那两个函数其内部实现也是定制,在函数的内部,Libevent封装的一套Win32线程、pthreads线程。然后调用evthread_set_lock_callbacks函数,进行定制。

        thread.h文件只提供了定制线程的接口,并没有提供使用线程接口。这点很像前面说到的Libevent日志和内存分配。其实这也很好理解。因为都是你提供定制的线程函数。你都能提供了,你肯定有办法使用,没必要要Libevent提供一些API给你使用。

        如果用户为libevent开启了多线程,那么libevent里面的函数就会变成线程安全的。此时主线程在使用event_base_dispatch,别的线程是可以线程安全地使用event_add把一个event添加到主线程的event_base中。具体的工作原理可以参考《evthread_notify_base通知主线程》。


锁和条件变量结构体:

        Libevent允许用户定制自己的锁和条件变量。其实现原理和前面说到的日志和内存分配一样,都是内部有一个全局变量。定制自己的锁和条件变量,就是对这个全局变量进行赋值。

        锁结构:

//thread.h文件
struct evthread_lock_callbacks {
	//版本号,设置为宏EVTHREAD_LOCK_API_VERSION
	int 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);
};
        目前Libevent支持的locktype
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值