在线文档教程
Sqlite
C界面 | C Interface

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 以任何方式失败,则预计在返回之前会自行清理。