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

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