SQLite 学习之路 第十节 互斥锁
互斥锁部分由mutex.c、mutex_w32.c、mutex_unix.c和mutex_noop.c实现
mutex.c的头文件mutex.h如下所示
#ifdef SQLITE_MUTEX_OMIT
#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8)
#define sqlite3_mutex_free(X)
#define sqlite3_mutex_enter(X)
#define sqlite3_mutex_try(X) SQLITE_OK
#define sqlite3_mutex_leave(X)
#define sqlite3_mutex_held(X) ((void)(X),1)
#define sqlite3_mutex_notheld(X) ((void)(X),1)
#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
#define sqlite3MutexInit() SQLITE_OK
#define sqlite3MutexEnd()
#define MUTEX_LOGIC(X)
#else
#define MUTEX_LOGIC(X) X
#endif
函数解释如下: int sqlite3MutexInit(void) 初始化互斥体变量 int sqlite3MutexEnd(void) 关闭互斥系统。释放sqlite3MutexInit()分配的资源。调用结构体中xMutexEnd,返回RC sqlite3_mutex *sqlite3_mutex_alloc(int id) 获取一个指向静态互斥锁或分配一个新的动态互斥锁。根据类型(id)分配新互斥锁 sqlite3_mutex *sqlite3MutexAlloc(int id) 功能同上 void sqlite3_mutex_free(sqlite3_mutex *p) 释放一个动态互斥锁 void sqlite3_mutex_enter(sqlite3_mutex *p) 获得互斥锁p。如果其他线程已经拥有互斥锁,那么就将其阻塞,直到它可以获得。 int sqlite3_mutex_try(sqlite3_mutex *p) 获得互斥锁p。如果成功,返回SQLITE_OK。否则,如果另一个线程持有互斥锁,它不能得到,就返回SQLITE_BUSY。 void sqlite3_mutex_leave(sqlite3_mutex *p) sqlite3_mutex_leave() 程序退出之前由相同的线程输入的互斥对象。如果一个空指针作为参数传递给该函数,那么就不做任何操作 int sqlite3_mutex_held(sqlite3_mutex *p) 调试状态P为0返回 xMutexHeld分配失败返回0 否则返回1 int sqlite3_mutex_notheld(sqlite3_mutex *p) P为0返回 xMutexHeld分配失败返回0, 否则返回1
互斥锁的初始化:
int sqlite3MutexInit(void){
int rc = SQLITE_OK;
if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
sqlite3_mutex_methods const *pFrom;
sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
if( sqlite3GlobalConfig.bCoreMutex ){
pFrom = sqlite3DefaultMutex();
}else{
pFrom = sqlite3NoopMutex();
}
pTo->xMutexInit = pFrom->xMutexInit;
pTo->xMutexEnd = pFrom->xMutexEnd;
pTo->xMutexFree = pFrom->xMutexFree;
pTo->xMutexEnter = pFrom->xMutexEnter;
pTo->xMutexTry = pFrom->xMutexTry;
pTo->xMutexLeave = pFrom->xMutexLeave;
pTo->xMutexHeld = pFrom->xMutexHeld;
pTo->xMutexNotheld = pFrom->xMutexNotheld;
sqlite3MemoryBarrier();
pTo->xMutexAlloc = pFrom->xMutexAlloc;
}
assert( sqlite3GlobalConfig.mutex.xMutexInit );
rc = sqlite3GlobalConfig.mutex.xMutexInit();
#ifdef SQLITE_DEBUG
GLOBAL(int, mutexIsInit) = 1;
#endif
return rc;
}
互斥体enter使用: 当一个线程想进入时,若另一个线程包含了互斥锁,就不能进入
void sqlite3_mutex_enter(sqlite3_mutex *p){
if( p ){
sqlite3GlobalConfig.mutex.xMutexEnter(p);
}
}
互斥体try使用: 企图进入一个互斥锁,sqlite3_mutex_enter()不被阻塞。互斥锁一旦成功键入,sqlite3_mutex_try()接口将返回一个标志位,这个标志位是 SQLITE_OK。
int sqlite3_mutex_try(sqlite3_mutex *p){
int rc = SQLITE_OK;
if( p ){
return sqlite3GlobalConfig.mutex.xMutexTry(p);
}
return rc;
}
|