Mutex Methods Object
互斥体方法对象
typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
struct sqlite3_mutex_methods {
int (*xMutexInit)(void
int (*xMutexEnd)(void
sqlite3_mutex *(*xMutexAlloc)(int
void (*xMutexFree)(sqlite3_mutex *
void (*xMutexEnter)(sqlite3_mutex *
int (*xMutexTry)(sqlite3_mutex *
void (*xMutexLeave)(sqlite3_mutex *
int (*xMutexHeld)(sqlite3_mutex *
int (*xMutexNotheld)(sqlite3_mutex *
};
该结构的一个实例定义了用于分配和使用互斥体的低级例程。
通常,SQLite 提供的默认互斥体实现已足够,但是应用程序可以选择将自定义实现替换为 SQLite 不提供合适实现的专用部署或系统。在这种情况下,应用程序会创建并填充此结构的实例,以及 SQLITE_CONFIG_MUTEX 选项一起传递给 sqlite3_config()。另外,当使用 SQLITE_CONFIG_GETMUTEX 选项查询当前互斥体实现的系统时,可以将此结构的实例用作输出变量。
由此结构定义的 xMutexInit 方法是由 sqlite3_initialize()函数作为系统初始化的一部分调用的。对于每次对 sqlite3_initialize()的有效调用,xMutexInit 例程都由 SQLite 调用一次。
这个结构定义的 xMutexEnd 方法是由 sqlite3_shutdown()函数作为系统关闭的一部分调用的。预计该方法的实现将释放由互斥方法实现获得的所有未完成资源,特别是通过 xMutexInit 方法获得的资源。每次调用 sqlite3_shutdown()时, xMutexEnd()接口都会调用一次。
该结构定义的其余七个方法(xMutexAlloc,xMutexFree,xMutexEnter,xMutexTry,xMutexLeave,xMutexHeld 和 xMutexNotheld)分别实现以下接口:
- sqlite3_mutex_alloc()
- sqlite3_mutex_free()
- sqlite3_mutex_enter()
- sqlite3_mutex_try()
- sqlite3_mutex_leave()
- sqlite3_mutex_held()
- sqlite3_mutex_notheld()
唯一的区别是上面列举的公共 sqlite3_XXX 函数默默忽略任何传递NULL指针而不是有效互斥句柄的调用。由这个结构定义的方法的实现并不需要处理这种情况,传递一个 NULL 指针而不是一个有效的 mutex 句柄的结果是未定义的(即,如果它传递 NULL 指针时提供一个段错误的实现是可以接受的)。
xMutexInit()方法必须是线程安全的。在相同的进程中多次调用xMutexInit()并且不干预对 xMutexEnd()的调用是无害的。第二次和以后对 xMutexInit()的调用必须是 no-ops。
xMutexInit()不得使用 SQLite 内存分配(sqlite3_malloc()及其关联)。同样,xMutexAlloc()不得为静态互斥使用 SQLite 内存分配。但是,xMutexAlloc()可能会使用 SQLite 内存分配进行快速递归或互斥。
当调用 sqlite3_shutdown()时,SQLite 将调用 xMutexEnd()方法,但只有先前调用 xMutexInit 时返回 SQLITE_OK。如果 xMutexInit 以任何方式失败,则预计在返回之前会自行清理。