SQLite C 接口

互斥锁

sqlite3_mutex *sqlite3_mutex_alloc(int);
void sqlite3_mutex_free(sqlite3_mutex*);
void sqlite3_mutex_enter(sqlite3_mutex*);
int sqlite3_mutex_try(sqlite3_mutex*);
void sqlite3_mutex_leave(sqlite3_mutex*);

SQLite 核心使用这些例程进行线程同步。尽管它们旨在供 SQLite 内部使用,但允许链接到 SQLite 的代码使用这些例程中的任何一个。

SQLite 源代码包含这些互斥例程的多个实现。在编译时自动选择适当的实现。SQLite 核心中提供了以下实现:

SQLITE_MUTEX_NOOP 实现是一组没有真正锁定的例程,适用于单线程应用程序。SQLITE_MUTEX_PTHREADS 和 SQLITE_MUTEX_W32 实现适用于 Unix 和 Windows。

如果使用定义的 SQLITE_MUTEX_APPDEF 预处理器宏(使用“-DSQLITE_MUTEX_APPDEF=1”)编译 SQLite,则库中不包含互斥实现。在这种情况下,应用程序必须 在调用 sqlite3_initialize() 或任何其他调用 sqlite3_initialize() 的公共 sqlite3_ 函数之前使用 sqlite3_config() 函数的SQLITE_CONFIG_MUTEX选项提供自定义互斥实现。

sqlite3_mutex_alloc() 例程分配一个新的互斥锁并返回指向它的指针。如果无法分配请求的互斥体,sqlite3_mutex_alloc() 例程返回 NULL。sqlite3_mutex_alloc() 的参数必须是这些整数常量之一:

前两个常量(SQLITE_MUTEX_FAST 和 SQLITE_MUTEX_RECURSIVE)导致 sqlite3_mutex_alloc() 创建一个新的互斥锁。当使用 SQLITE_MUTEX_RECURSIVE 时,新的互斥锁是递归的,但当使用 SQLITE_MUTEX_FAST 时,则不一定如此。互斥量实现不需要区分 SQLITE_MUTEX_RECURSIVE 和 SQLITE_MUTEX_FAST 如果不想的话。SQLite 只会在确实需要递归互斥量的情况下请求递归互斥量。如果主机平台上有更快的非递归互斥体实现,互斥体子系统可能会返回这样的互斥体以响应 SQLITE_MUTEX_FAST。

sqlite3_mutex_alloc() 的其他允许参数(除 SQLITE_MUTEX_FAST 和 SQLITE_MUTEX_RECURSIVE 之外的任何参数)每个都返回一个指向静态预先存在的互斥体的指针。当前版本的 SQLite 使用了九个静态互斥锁。SQLite 的未来版本可能会添加额外的静态互斥锁。静态互斥量仅供 SQLite 内部使用。使用 SQLite 互斥锁的应用程序应该只使用由 SQLITE_MUTEX_FAST 或 SQLITE_MUTEX_RECURSIVE 返回的动态互斥锁。

请注意,如果使用其中一个动态互斥参数(SQLITE_MUTEX_FAST 或 SQLITE_MUTEX_RECURSIVE),则 sqlite3_mutex_alloc() 会在每次调用时返回不同的互斥。对于静态互斥锁类型,每次调用具有相同类型编号时都会返回相同的互斥锁。

sqlite3_mutex_free() 例程释放先前分配的动态互斥量。尝试解除分配静态互斥会导致未定义的行为。

sqlite3_mutex_enter() 和 sqlite3_mutex_try() 例程尝试进入互斥锁。如果另一个线程已经在互斥体中,sqlite3_mutex_enter() 将阻塞并且 sqlite3_mutex_try() 将返回 SQLITE_BUSY。sqlite3_mutex_try() 接口 在成功进入时返回SQLITE_OK 。使用 SQLITE_MUTEX_RECURSIVE 创建的互斥量可以由同一个线程多次输入。在这种情况下,互斥量必须在另一个线程进入之前退出相同的次数。如果同一线程多次尝试进入除 SQLITE_MUTEX_RECURSIVE 之外的任何互斥量,则行为未定义。

有些系统(例如Windows 95)不支持sqlite3_mutex_try()实现的操作。在那些系统上,sqlite3_mutex_try() 将始终返回 SQLITE_BUSY。SQLite 核心只使用 sqlite3_mutex_try() 作为优化,所以这是可以接受的行为。

sqlite3_mutex_leave() 例程退出先前由同一线程输入的互斥量。如果调用线程当前未输入互斥量或当前未分配互斥量,则行为未定义。

如果 sqlite3_mutex_enter()、sqlite3_mutex_try() 或 sqlite3_mutex_leave() 的参数是 NULL 指针,则所有三个例程都表现为空操作。

另见:sqlite3_mutex_held()sqlite3_mutex_notheld()

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