SQLite多線程使用總結

來源:互聯網
上載者:User

標籤:style   color   使用   ar   資料   sp   div   on   linux   

SQLite支援3種線程模式:  單線程:這種模式下,沒有進行互斥,多線程使用不安全。禁用所有的mutex鎖,並發使用時會出錯。當SQLite編譯時間加了SQLITE_THREADSAFE=0參數,或者在初始化SQLite前調用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)時啟用。  多線程:這種模式下,只要一個資料庫連接不被多個線程同時使用就是安全的。源碼中是啟用bCoreMutex,禁用bFullMutex。實際上就是禁用資料庫連接和prepared statement(準備好的語句)上的鎖,因此不能在多個線程中並發使用同一個資料庫連接或prepared statement。當SQLite編譯時間加了SQLITE_THREADSAFE=2參數時預設啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)啟用;或者在建立資料庫連接時,設定SQLITE_OPEN_NOMUTEX flag。  串列:sqlite是安全執行緒的。啟用所有的鎖,包括bCoreMutex和bFullMutex 。因為資料庫連接和prepared statement都已加鎖,所以多線程使用這些對象時沒法並發,也就變成串列了。當SQLite編譯時間加了SQLITE_THREADSAFE =1參數時預設啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調用sqlite3_config(SQLITE_CONFIG_SERIALIZED)啟用;或者在建立資料庫連接時,設定SQLITE_OPEN_FULLMUTEX flag  。    而這裡所說的初始化是指調用sqlite3_initialize()函數,這個函數在調用sqlite3_open()時會自動調用,且只有第一次調用是有效.    為了達到安全執行緒,SQLite在編譯時間必須將 SQLITE_THREADSAFE 預先處理宏置為1。在Windows和Linux上, 已編譯的好的二進位發行版中都是這樣設定的。 如果不確定你所使用的庫是否是安全執行緒的,可以調用 sqlite3_threadsafe() 介面找出。調用sqlite3_threadsafe()可以獲得編譯期的SQLITE_THREADSAFE參數 。    也就是說線程模式可以在編譯時間(通過源碼編譯sqlite庫時)、啟動時(使用sqlite的應用程式初始化時)或者運行時(建立資料庫連接時)來指定。一般而言,運行時指定的模式將覆蓋啟動時的指定模式,啟動時指定的模式將覆蓋編譯時間指定的模式。但是,單線程模式一旦被指定,將無法被覆蓋。預設的線程模式是串列模式。  編譯時間選擇線程模式    可以通過定義SQLITE_THREADSAFE宏來指定線程模式。如果沒有指定,預設為串列模式。定義宏SQLITE_THREADSAFE=1指定使用串列模式;=0使用單線程模式;=2使用多線程模式。    sqlite3_threadsafe()函數的傳回值可以確定編譯時間指定的線程模式。如果指定了單線程模式,函數返回false。如果指定了串列或者多線程模式,函數返回true。由於sqlite3_threadsafe()函數要早於多線程模式以及啟動時和運行時的模式選擇,所以它既不能區別多線程模式和串列模式也不能區別啟動時和運行時的模式。    最後一句可通過sqlite3_threadsafe函數的實現來理解SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }如果編譯時間指定了單線程模式,那麼臨界互斥邏輯在構造時就被省略,因此也就無法在啟動時或運行時指定串列模式或多線程模式。 啟動時選擇線程模式    假如在編譯時間沒有指定單線程模式,就可以在應用程式初始化時使用sqlite3_config()函數修改線程模式。參數SQLITE_CONFIG_SINGLETHREAD可指定為單線程模式,SQLITE_CONFIG_MULTITHREAD指定為多線程模式,SQLITE_CONFIG_SERIALIZED指定為串列模式。 運行時選擇線程模式    如果沒有在編譯時間和啟動時指定為單線程模式,那麼每個資料庫連接在建立時可單獨的被指定為多線程模式或者串列模式,但是不能指定為單線程模式。如果在編譯時間或啟動時指定為單線程模式,就無法在建立串連時指定多線程或者串列模式。    建立串連時用sqlite3_open_v2()函數的第三個參數來指定線程模式。SQLITE_OPEN_NOMUTEX標識建立多線程模式的串連;SQLITE_OPEN_FULLMUTEX標識建立串列模式的串連。如果沒有指定標識,或者使用sqlite3_open()或sqlite3_open16()函數來建立資料庫連接,那麼在編譯時間或啟動時指定的線程模式將作為預設的線程模式使用。

SQLite多線程使用總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.