SQLite3在多線程環境中使用


SQLite3在多線程環境中使用


    SQLite支持三種不同的線程模式:
    * 單線程。在這種模式下所有的互斥鎖都被禁用,在多個線程中同時使用SQLite時是不安全的。
    * 多線程。在這種模式下,只要沒有單個數據庫連接被同時用在多個線程中的情況,SQLite就可以在多線程環境中安全地使用。
    * 串行化。在這種模式中,SQLite可以無限制地在多線程環境中安全地使用。
    線程模式可以在編譯時(把SQLite源代碼編譯成庫時)、啟動時(使用SQLite的應用程序初始化時)或運行時(一個新的SQLite數據庫連接創建時)指定。一般來說,運行時參數會覆蓋掉啟動時參數,啟動時參數會覆蓋掉編譯時參數,但是單線程模式一旦被指定后,就不能被覆蓋。默認的模式是串行模式。
    (1)編譯時的線程模式選項
    通過SQLITE_THREADSAFE編譯時參數來選擇線程模式。如果沒有指定SQLITE_THREADSAFE參數,則使用串行化模式。也可以顯式地使用-DSQLITE_THREADSAFE=1來指定串行化模式。-DSQLITE_THREADSAFE=0表示單線程模式,-DSQLITE_THREADSAFE=2表示多線程模式。
    sqlite3_threadsafe()接口的返回值由編譯時線程模式選項來確定。如果編譯時指定單線程模式,則sqlite3_threadsafe()返回false。如果指定多線程模式或串行化模式,則sqlite3_threadsafe()返回true。sqlite3_threadsafe()不能區分多線程模式和串行化模式,也不能報告啟動時或運行時的模式更改。
    如果編譯時指定單線程模式,則編譯庫時關鍵的互斥邏輯會被忽略,因此不可能在啟動時或運行不可能再激活多線程或串行化模式。
    (2)啟動時的線程模式選項
    如果編譯時沒有指定單線程模式,則在使用sqlite3_config()接口進行初始化時可以改變線程模式。SQLITE_CONFIG_SINGLETHREAD謂詞把SQLite設置成單線程模式,SQLITE_CONFIG_MULTITHREAD設置多線程模式,SQLITE_CONFIG_SERIALIZED設置串行化模式。
    (3)運行時的線程模式選項
    如果編譯時或啟動時沒有指定單線程模式,則單個數據連接可以被創建為多線程或串行化模式,不可能將單個數據庫連接降級為單線程模式。如果編譯時或啟動時指定單線程模式,則不可能將單個數據庫連接升級為多線程或串行化模式。
    單個數據庫連接的線程模式由sqlite3_open_v2()的第三個參數給定的標志來確定。SQLITE_OPEN_NOMUTEX標志表示數據庫連接為多線程模式,SQLITE_OPEN_FULLMUTEX表示該連接為串行化模式。如果沒有指定標志,或者使用sqlite3_open(), sqlite3_open16(),而不是sqlite3_open_v2(),則使用編譯時或啟動時指定的線程模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM