libevent中是默认不开启多线程的,也就没有什么锁, 条件变量等的说法了
我们可以使用evthread_use_pthreads()开启linux下的pthread
或者使用evthread_set_lock_callbacks定制属于自己的多线程, 锁, 条件变量等
根据官方给出的文档, 支持的锁类型有:
支持的锁mode有:
以上是封装的线程锁, 下面是封装的线程条件变量:
因为对于条件变量的包装类似, 所以这里略过
我们可以使用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