麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

深入SQLite多線程的使用總結(jié)詳解

2019-11-26 16:06:26
字體:
供稿:網(wǎng)友

SQLite支持3種線程模式:
  單線程:這種模式下,沒有進(jìn)行互斥,多線程使用不安全。禁用所有的mutex鎖,并發(fā)使用時會出錯。當(dāng)SQLite編譯時加了SQLITE_THREADSAFE=0參數(shù),或者在初始化SQLite前調(diào)用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)時啟用。

  多線程:這種模式下,只要一個數(shù)據(jù)庫連接不被多個線程同時使用就是安全的。源碼中是啟用bCoreMutex,禁用bFullMutex。實際上就是禁用數(shù)據(jù)庫連接和prepared statement(準(zhǔn)備好的語句)上的鎖,因此不能在多個線程中并發(fā)使用同一個數(shù)據(jù)庫連接或prepared statement。當(dāng)SQLite編譯時加了SQLITE_THREADSAFE=2參數(shù)時默認(rèn)啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調(diào)用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)啟用;或者在創(chuàng)建數(shù)據(jù)庫連接時,設(shè)置SQLITE_OPEN_NOMUTEX flag。

  串行:sqlite是線程安全的。啟用所有的鎖,包括bCoreMutex和bFullMutex 。因為數(shù)據(jù)庫連接和prepared statement都已加鎖,所以多線程使用這些對象時沒法并發(fā),也就變成串行了。當(dāng)SQLite編譯時加了SQLITE_THREADSAFE =1參數(shù)時默認(rèn)啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調(diào)用sqlite3_config(SQLITE_CONFIG_SERIALIZED)啟用;或者在創(chuàng)建數(shù)據(jù)庫連接時,設(shè)置SQLITE_OPEN_FULLMUTEX flag  。

    而這里所說的初始化是指調(diào)用sqlite3_initialize()函數(shù),這個函數(shù)在調(diào)用sqlite3_open()時會自動調(diào)用,且只有第一次調(diào)用是有效的.

   為了達(dá)到線程安全,SQLite在編譯時必須將 SQLITE_THREADSAFE 預(yù)處理宏置為1。在Windows和Linux上, 已編譯的好的二進(jìn)制發(fā)行版中都是這樣設(shè)置的。如果不確定你所使用的庫是否是線程安全的,可以調(diào)用 sqlite3_threadsafe() 接口找出。調(diào)用sqlite3_threadsafe()可以獲得編譯期的SQLITE_THREADSAFE參數(shù) 。

   也就是說線程模式可以在編譯時(通過源碼編譯sqlite庫時)、啟動時(使用sqlite的應(yīng)用程序初始化時)或者運行時(創(chuàng)建數(shù)據(jù)庫連接時)來指定。一般而言,運行時指定的模式將覆蓋啟動時的指定模式,啟動時指定的模式將覆蓋編譯時指定的模式。但是,單線程模式一旦被指定,將無法被覆蓋。默認(rèn)的線程模式是串行模式。

編譯時選擇線程模式
    可以通過定義SQLITE_THREADSAFE宏來指定線程模式。如果沒有指定,默認(rèn)為串行模式。定義宏SQLITE_THREADSAFE=1指定使用串行模式;=0使用單線程模式;=2使用多線程模式。

    sqlite3_threadsafe()函數(shù)的返回值可以確定編譯時指定的線程模式。如果指定了單線程模式,函數(shù)返回false。如果指定了串行或者多線程模式,函數(shù)返回true。由于sqlite3_threadsafe()函數(shù)要早于多線程模式以及啟動時和運行時的模式選擇,所以它既不能區(qū)別多線程模式和串行模式也不能區(qū)別啟動時和運行時的模式。

    最后一句可通過sqlite3_threadsafe函數(shù)的實現(xiàn)來理解SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }如果編譯時指定了單線程模式,那么臨界互斥邏輯在構(gòu)造時就被省略,因此也就無法在啟動時或運行時指定串行模式或多線程模式。

啟動時選擇線程模式
    假如在編譯時沒有指定單線程模式,就可以在應(yīng)用程序初始化時使用sqlite3_config()函數(shù)修改線程模式。參數(shù)SQLITE_CONFIG_SINGLETHREAD可指定為
單線程模式,SQLITE_CONFIG_MULTITHREAD指定為多線程模式,SQLITE_CONFIG_SERIALIZED指定為串行模式。

運行時選擇線程模式
    如果沒有在編譯時和啟動時指定為單線程模式,那么每個數(shù)據(jù)庫連接在創(chuàng)建時可單獨的被指定為多線程模式或者串行模式,但是不能指定為單線程模式。如果在編譯時或啟動時指定為單線程模式,就無法在創(chuàng)建連接時指定多線程或者串行模式。

    創(chuàng)建連接時用sqlite3_open_v2()函數(shù)的第三個參數(shù)來指定線程模式。SQLITE_OPEN_NOMUTEX標(biāo)識創(chuàng)建多線程模式的連接;SQLITE_OPEN_FULLMUTEX標(biāo)識創(chuàng)建串行模式的連接。如果沒有指定標(biāo)識,或者使用sqlite3_open()或sqlite3_open16()函數(shù)來創(chuàng)建數(shù)據(jù)庫連接,那么在編譯時或啟動時指定的線程模式將作為默認(rèn)的線程模式使用。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: a免费视频| 国产高清自拍一区 | 牛牛a级毛片在线播放 | 欧美成人精品一区二区 | 日韩高清影视 | 日本在线视频二区 | 成年性羞羞视频免费观看无限 | 狠狠干天天操 | 啪啪激情| 蜜桃成品人免费视频 | 在线亚洲欧美 | 污视频在线免费播放 | 欧美另类视频在线 | 日韩视频一区 | www噜噜偷拍在线视频 | av在线等| 黄色免费播放网站 | 精品中文视频 | 久久精品视频在线看99 | 在线a毛片| 精品国产乱码久久久久久丨区2区 | 麻豆porn | 欧美a区 | 欧美成人se01短视频在线看 | 羞羞视频免费视频欧美 | 视频一区二区三区在线播放 | 在线成人一区二区 | 精品亚洲一区二区三区 | 亚洲伊人色欲综合网 | 91aa.app| 成人毛片在线免费看 | 日本中文不卡视频 | 久久久国产一区二区三区 | 美女毛片在线观看 | 毛片免费在线视频 | 成熟女人特级毛片www免费 | 国产一级淫片a级aaa | 午夜视 | 久久99精品久久久久久小说 | 国产一级毛片国产 | 久久综合久久综合久久 |