Small. Fast. Reliable.
Choose any three.

SQLite C接口

互斥方法对象

typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
struct sqlite3_mutex_methods {
  int(* xMutexInit)(无效);
  int(* xMutexEnd)(无效);
  sqlite3_mutex *(* xMutexAlloc)(int);
  无效(* xMutexFree)(sqlite3_mutex *);
  无效(* xMutexEnter)(sqlite3_mutex *);
  int(* xMutexTry)(sqlite3_mutex *);
  无效(* xMutexLeave)(sqlite3_mutex *);
  int(* xMutexHeld)(sqlite3_mutex *);
  int(* xMutexNotheld)(sqlite3_mutex *);
};

此结构的一个实例定义了用于分配和使用互斥锁的低级例程。

通常,SQLite提供的默认互斥体实现就足够了,但是应用程序可以选择用自定义实现代替SQLite无法提供合适实现的专用部署或系统。在这种情况下,应用程序将创建并填充此结构的实例,以将其与SQLITE_CONFIG_MUTEX选项一起传递给sqlite3_config()。此外,在使用SQLITE_CONFIG_GETMUTEX选项向系统查询当前互斥量实现时,可以将此结构的实例用作输出变量。

由sqlite3_initialize()函数调用此结构定义的xMutexInit方法作为系统初始化的一部分。对于每次对sqlite3_initialize()的有效调用,SQLite均只调用一次xMutexInit例程。

sqlite3_shutdown()函数在系统关闭过程中调用此结构定义的xMutexEnd方法。预期此方法的实现将释放通过互斥锁方法实现而获得的所有出色资源,尤其是通过xMutexInit方法获得的资源。对于sqlite3_shutdown()的每次调用,xMutexEnd()接口仅被调用一次。

此结构定义的其余七个方法(xMutexAlloc,xMutexFree,xMutexEnter,xMutexTry,xMutexLeave,xMutexHeld和xMutexNotheld)分别实现以下接口:

唯一的区别是,上面枚举的公共sqlite3_XXX函数默默地忽略了任何传递NULL指针而不是有效的互斥锁句柄的调用。不需要这种结构定义的方法的实现来处理这种情况。传递NULL指针而不是有效的互斥锁句柄的结果是不确定的(即,如果传递NULL指针,则提供分段隔离的实现是可以接受的)。

xMutexInit()方法必须是线程安全的。在同一进程中多次调用xMutexInit()且不干预xMutexEnd()的调用必须无害。对xMutexInit()的第二次和后续调用必须是no-ops。

xMutexInit()不得使用SQLite内存分配(sqlite3_malloc() 及其关联)。同样,xMutexAlloc()不得将SQLite内存分配用于静态互斥锁。但是,xMutexAlloc()可以将SQLite内存分配用于快速或递归互斥体。

当调用sqlite3_shutdown()时,SQLite将调用xMutexEnd()方法,但前提是先前对xMutexInit的调用返回了SQLITE_OK。如果xMutexInit发生任何故障,则应先清除后再返回。

另请参见 对象常量函数的列表