SQLite的線程模式

1. 概述

SQLite支持3種不同的線程模式:

  1. 單線程(Single-thread). 在這種模式中, 沒有任何互斥量(mutex), 在多個線程中同時使用SQLite是不安全的.
  2. 多線程(Multi-thread). 在這種模式中, 可以在多線程中安全的使用SQLite, 但是必須保證,單一的SQLite連接不能在多線程中同時使用.
  3. 串行模式(Serialized). 在這種模式中, SQLite在多線程中可以安全的使用, 沒有任何限制.

線程模式可以在編譯期進行配置,也可以在初始化時進行配置,還可以在運行期進行配置(創建SQLite連接時).通常來講, 運行期的配置會覆蓋初始化的配置, 初始化的配置會覆蓋編譯期的配置.一個例外是, 編譯期的單線程模式一旦配置了,就無法改變了.

SQLite的默認多線程模式是串行模式.

2. 在編譯期配置線程模式

使用SQLITE_THREADSAFE編譯期參數配置線程模式,如果未提供該參數,將使用串行模式.也可以顯式的定義-DSQLITE_THREADSAFE=1來配置串行模式.定義-DSQLITE_THREADSAFE=0可以配置單線程模式. 定義-DSQLITE_THREADSAFE=2可以配置多線程模式.

編譯期的線程模式的配置可以使用SQLite接口函數 sqlite3_threadsafe()的返回值來檢查.如果在編譯期配置了單線程模式, 該函數返回false, 如果配置了多線程或者串行模式, 該函數返回true.從邏輯上將, 該函數執行時機早於初始化和運行期的配置,因此無法區分多線程模式和串行模式, 也無法檢測到這兩個階段的線程模式的改變.

如果在編譯期配置了單線程模式,在源碼編譯的時候, 臨界區的互斥量邏輯將被移除,因此,在隨後的初始化階段和運行階段,將不能切換到多線程模式和串行模式.

3. 在初始化時配置線程模式

假設在編譯期沒有配置單線程模式,那麼在初始化階段,可以使用接口函數 sqlite3_config()改變線程模式.該函數的輸入參數SQLITE_CONFIG_SINGLETHREAD可以配置單線程模式, 輸入參數SQLITE_CONFIG_MULTITHREAD可以配置多線程模式,輸入參數SQLITE_CONFIG_SERIALIZED可以配置串行模式.

4.在運行期配置線程模式

如果在編譯期和初始化階段沒有配置爲單線程模式,那麼創建數據庫連接的時候,可以配置爲多線程模式,也可以配置爲串行模式.對於一個數據庫連接, 是不可能降級爲單線程模式的,同時,如果編譯期或者初始化階段配置爲單線程模式,也不可能升級爲其他線程模式.

SQLite數據庫連接的線程模式是由接口函數 sqlite3_open_v2()來配置的,該函數的第三個參數決定配置哪種線程模式,參數 SQLITE_OPEN_NOMUTEX將配置數據庫連接爲多線程模式,參數SQLITE_OPEN_FULLMUTEX將配置數據庫連接爲串行模式.如果沒有指定該參數,或者使用的是接口 sqlite3_open()或者 sqlite3_open16()打開的數據庫連接,那麼,該連接的線程模式取決於編譯期和初始化階段的配置.

--------------------------------------------------------分割線---------------------------------------------------
原文鏈接:https://www.sqlite.org/threadsafe.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章