SQLite支持不同的线程模式:
1、 Single-thread。这种模式下,锁会失效,多线程同时使用不安全。
2、 Multi-thread。这种模式下,每个线程需要使用它们各自的连接,一个连接不能同时被多个线程使用。
3、 Serialized。这种模式下,是多线程安全的。
线程模式可以在编译期(编译SQLite库)、初始化期(应用开始使用SQLite)、运行期(创建连接)选择。通常,运行期会覆盖初始化期的选择,初始化期会覆盖编译器的选择。但是,一旦Single-thread不能被覆盖。
默认为Serialized。
编译期选择线程模式
使用SQLITE_THRWADSAFE选项去选择线程模式。如果没指定该选项,会使用Serialized。
-DSQLITE_THREADSAFE=0:Single-thread
-DSQLITE_THREADSAFE=1:Multi-thread
-DSQLITE_THREADSAFE=2:Serialized
接口sqlite3_threadsafe()返回值指向的是编译期选定的线程模式。false表示Single-thread,true表示Multi-thread或Serialized。
如果在编译期选择Single-thread,锁逻辑在构建时会被忽略,所以不能在初始化期或运行期改成Multi-thread或Serialized。
初始化期选择线程模式
sqlite3_config()接口
运行期选择线程模式
不能在运行期将单个连接的模型选为single-thread
sqlite3_open_v2()接口:
SQLITE_OPEN_NOMUTEX标志会选择multi-thread,SQLITE_OPEN_FULLMUTEX标志会选择serialized
没指定标志会使用编译期和初始化期的线程模式。