SQLite3在多线程环境中使用


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(),则使用编译时或启动时指定的线程模式。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM