SQLite支持3种不同的线程模式:
线程模式可以在编译期进行配置,也可以在初始化时进行配置,还可以在运行期进行配置(创建SQLite连接时).通常来讲, 运行期的配置会覆盖初始化的配置, 初始化的配置会覆盖编译期的配置.一个例外是, 编译期的单线程模式一旦配置了,就无法改变了.
SQLite的默认多线程模式是串行模式.
使用SQLITE_THREADSAFE编译期参数配置线程模式,如果未提供该参数,将使用串行模式.也可以显式的定义-DSQLITE_THREADSAFE=1来配置串行模式.定义-DSQLITE_THREADSAFE=0可以配置单线程模式. 定义-DSQLITE_THREADSAFE=2可以配置多线程模式.
编译期的线程模式的配置可以使用SQLite接口函数 sqlite3_threadsafe()的返回值来检查.如果在编译期配置了单线程模式, 该函数返回false, 如果配置了多线程或者串行模式, 该函数返回true.从逻辑上将, 该函数执行时机早于初始化和运行期的配置,因此无法区分多线程模式和串行模式, 也无法检测到这两个阶段的线程模式的改变.
如果在编译期配置了单线程模式,在源码编译的时候, 临界区的互斥量逻辑将被移除,因此,在随后的初始化阶段和运行阶段,将不能切换到多线程模式和串行模式.
假设在编译期没有配置单线程模式,那么在初始化阶段,可以使用接口函数 sqlite3_config()改变线程模式.该函数的输入参数SQLITE_CONFIG_SINGLETHREAD可以配置单线程模式, 输入参数SQLITE_CONFIG_MULTITHREAD可以配置多线程模式,输入参数SQLITE_CONFIG_SERIALIZED可以配置串行模式.
如果在编译期和初始化阶段没有配置为单线程模式,那么创建数据库连接的时候,可以配置为多线程模式,也可以配置为串行模式.对于一个数据库连接, 是不可能降级为单线程模式的,同时,如果编译期或者初始化阶段配置为单线程模式,也不可能升级为其他线程模式.
SQLite数据库连接的线程模式是由接口函数 sqlite3_open_v2()来配置的,该函数的第三个参数决定配置哪种线程模式,参数 SQLITE_OPEN_NOMUTEX将配置数据库连接为多线程模式,参数SQLITE_OPEN_FULLMUTEX将配置数据库连接为串行模式.如果没有指定该参数,或者使用的是接口 sqlite3_open()或者 sqlite3_open16()打开的数据库连接,那么,该连接的线程模式取决于编译期和初始化阶段的配置.
--------------------------------------------------------分割线---------------------------------------------------
原文链接:https://www.sqlite.org/threadsafe.html