深刻SQLite多線程的應用總結詳解。本站提示廣大學習愛好者:(深刻SQLite多線程的應用總結詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻SQLite多線程的應用總結詳解正文
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()函數來創立數據庫銜接,那末在編譯時或啟動時指定的線程形式將作為默許的線程形式應用。