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() 用於優化,因此這是可接受的行為。例外情況是設定 SQLITE_ENABLE_SETLK_TIMEOUT 編譯選項的 Unix 版本。在這種情況下,需要一個可正常運作的 sqlite3_mutex_try()。
sqlite3_mutex_leave() 常式會釋放先前由同一執行緒進入的互斥鎖。如果互斥鎖目前並非由呼叫執行緒進入或尚未配置,則其行為未定義。
如果 sqlite3_mutex_enter()、sqlite3_mutex_try()、sqlite3_mutex_leave() 或 sqlite3_mutex_free() 的參數為 NULL 指標,則這四個常式中的任何一個都將視為無操作。