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() 函数的系统初始化过程中被调用。xMutexInit 例程对每次有效调用 sqlite3_initialize() 都被 SQLite 调用一次。
该结构定义的 xMutexEnd 方法在 sqlite3_shutdown() 函数的系统关闭过程中被调用。该方法的实现预期释放互斥锁方法实现获取的所有未完成资源,尤其是由 xMutexInit 方法获取的资源。xMutexEnd() 接口对每次调用 sqlite3_shutdown() 都被调用一次。
该结构定义的其余七个方法(xMutexAlloc、xMutexFree、xMutexEnter、xMutexTry、xMutexLeave、xMutexHeld 和 xMutexNotheld)分别实现了以下接口:
唯一的区别是,上面列出的公共 sqlite3_XXX 函数会静默忽略传递空指针而不是有效互斥锁句柄的任何调用。该结构定义的方法的实现不需要处理这种情况。传递空指针而不是有效互斥锁句柄的结果是未定义的(即,提供在传递空指针时会产生段错误的实现是可以接受的)。
xMutexInit() 方法必须是线程安全的。在同一个进程中调用 xMutexInit() 多次,并且没有调用 xMutexEnd(),这样做是无害的。对 xMutexInit() 的第二次及后续调用必须是无操作的。
xMutexInit() 必须不能使用 SQLite 内存分配 (sqlite3_malloc() 及其关联函数)。类似地,xMutexAlloc() 必须不能为静态互斥锁使用 SQLite 内存分配。但是,xMutexAlloc() 可以为快速或递归互斥锁使用 SQLite 内存分配。
当 sqlite3_shutdown() 被调用时,SQLite 会调用 xMutexEnd() 方法,但前提是先前对 xMutexInit 的调用返回了 SQLITE_OK。如果 xMutexInit 以任何方式失败,则预期它在返回之前会自行清理。