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() 函式呼叫。SQLite 會針對每次有效呼叫 sqlite3_initialize() 時,呼叫 xMutexInit 常式一次。
此結構定義的 xMutexEnd 方法會在系統關閉過程中由 sqlite3_shutdown() 函式呼叫。此方法的實現應釋放互斥鎖方法實現所獲得的所有未釋放資源,尤其是 xMutexInit 方法所獲得的資源。每次呼叫 sqlite3_shutdown() 時,都會呼叫 xMutexEnd() 介面一次。
此結構定義的其他七個方法(xMutexAlloc、xMutexFree、xMutexEnter、xMutexTry、xMutexLeave、xMutexHeld 和 xMutexNotheld)分別實現了以下介面:
唯一的區別是,上面列舉的公開 sqlite3_XXX 函式會自動忽略任何傳遞 NULL 指標而不是有效互斥鎖控制代碼的呼叫。此結構定義的方法的實現不需要處理這種情況。傳遞 NULL 指標而不是有效互斥鎖控制代碼的結果未定義(即,如果傳遞 NULL 指標,則可以提供會發生區段錯誤的實現)。
xMutexInit() 方法必須是執行緒安全的。在同一個處理程序中多次呼叫 xMutexInit() 且不呼叫 xMutexEnd() 必須是無害的。第二次及後續呼叫 xMutexInit() 必須是無運算 (no-op)。
xMutexInit() 不得使用 SQLite 記憶體配置(sqlite3_malloc() 及其相關函式)。同樣地,xMutexAlloc() 不得使用 SQLite 記憶體配置來配置靜態互斥鎖。然而,xMutexAlloc() 可以使用 SQLite 記憶體配置來配置快速或遞迴互斥鎖。
當呼叫 sqlite3_shutdown() 時,SQLite 會呼叫 xMutexEnd() 方法,但前提是先前呼叫 xMutexInit 返回 SQLITE_OK。如果 xMutexInit 以任何方式失敗,則應在返回之前自行清理。