SQLite3在多线程环境中使用
SQLite支持三种不同的线程模式:
* 单线程。在这种模式下所有的互斥锁都被禁用,在多个线程中同时使用SQLite时是不安全的。
* 多线程。在这种模式下,只要没有单个数据库连接被同时用在多个线程中的情况,SQLite就可以在多线程环境中安全地使用。
* 串行化。在这种模式中,SQLite可以无限制地在多线程环境中安全地使用。
线程模式可以在编译时(把SQLite源代码编译成库时)、启动时(使用SQLite的应用程序初始化时)或运行时(一个新的SQLite数据库连接创建时)指定。一般来说,运行时参数会覆盖掉启动时参数,启动时参数会覆盖掉编译时参数,但是单线程模式一旦被指定后,就不能被覆盖。默认的模式是串行模式。
(1)编译时的线程模式选项
通过SQLITE_THREADSAFE编译时参数来选择线程模式。如果没有指定SQLITE_THREADSAFE参数,则使用串行化模式。也可以显式地使用-DSQLITE_THREADSAFE=1来指定串行化模式。-DSQLITE_THREADSAFE=0表示单线程模式,-DSQLITE_THREADSAFE=2表示多线程模式。
sqlite3_threadsafe()接口的返回值由编译时线程模式选项来确定。如果编译时指定单线程模式,则sqlite3_threadsafe()返回false。如果指定多线程模式或串行化模式,则sqlite3_threadsafe()返回true。sqlite3_threadsafe()不能区分多线程模式和串行化模式,也不能报告启动时或运行时的模式更改。
如果编译时指定单线程模式,则编译库时关键的互斥逻辑会被忽略,因此不可能在启动时或运行不可能再激活多线程或串行化模式。
(2)启动时的线程模式选项
如果编译时没有指定单线程模式,则在使用sqlite3_config()接口进行初始化时可以改变线程模式。SQLITE_CONFIG_SINGLETHREAD谓词把SQLite设置成单线程模式,SQLITE_CONFIG_MULTITHREAD设置多线程模式,SQLITE_CONFIG_SERIALIZED设置串行化模式。
(3)运行时的线程模式选项
如果编译时或启动时没有指定单线程模式,则单个数据连接可以被创建为多线程或串行化模式,不可能将单个数据库连接降级为单线程模式。如果编译时或启动时指定单线程模式,则不可能将单个数据库连接升级为多线程或串行化模式。
单个数据库连接的线程模式由sqlite3_open_v2()的第三个参数给定的标志来确定。SQLITE_OPEN_NOMUTEX标志表示数据库连接为多线程模式,SQLITE_OPEN_FULLMUTEX表示该连接为串行化模式。如果没有指定标志,或者使用sqlite3_open(), sqlite3_open16(),而不是sqlite3_open_v2(),则使用编译时或启动时指定的线程模式。