Sqlite   发布时间:2022-05-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了深入SQLite多线程的使用总结详解大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

sqlite支持3种线程模式:
@H_502_3@  单线程:这种模式下没有进行互斥,多线程使用不安全。禁用所有的mutex锁,并发使用时会出错。当sqlite编译时加了@R_902_5607@THREADSAFE=0参数,或者在初始化sqlite前调用sqlite3_config(@R_902_5607@CONfig_SINGLETHREAD)时启用。

  多线程:这种模式下,只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当sqlite编译时加了@R_902_5607@THREADSAFE=2参数时默认启用。若@R_902_5607@THREADSAFE不为0,可以在初始化sqlite前,调用sqlite3_config(@R_902_5607@CONfig_MulTITHREAD)启用;或者在创建数据库连接时,设置@R_902_5607@OPEN_NOMUTEX flag。

  串行:sqlite是线程安全的。启用所有的锁,包括bCoreMutex和bFullMutex 。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当sqlite编译时加了@R_902_5607@THREADSAFE =1参数时默认启用。若@R_902_5607@THREADSAFE不为0,可以在初始化sqlite前,调用sqlite3_config(@R_902_5607@CONfig_serialiZED)启用;或者在创建数据库连接时,设置@R_902_5607@OPEN_FulLMUTEX flag 。

而这里所说的初始化是指调用sqlite3_initialize()函数,这个函数在调用sqlite3_open()时会自动调用,且只有第一次调用是有效的.

为了达到线程安全,sqlite在编译时必须将 @R_902_5607@THREADSAFE 预处理宏置为1。在windows和linux上, 已编译的好的二进制发行版中都是这样设置的。如果不确定你所使用的库是否是线程安全的,可以调用 sqlite3_threadsafe() 接口找出。调用sqlite3_threadsafe()可以获得编译期的@R_902_5607@THREADSAFE参数 。

也就是说线程模式可以在编译时(通过源码编译sqlite库时)、启动时(@R_772_7251@te的应用程序初始化时)或者运行时(创建数据库连接时)来指定。一般而言,运行时指定的模式将覆盖启动时的指定模式,启动时指定的模式将覆盖编译时指定的模式。但是,单线程模式一旦被指定,将无法被覆盖。默认的线程模式是串行模式。

编译时选择线程模式
@H_502_3@ 可以通过定义@R_902_5607@THREADSAFE宏来指定线程模式。如果没有指定,默认为串行模式。定义宏@R_902_5607@THREADSAFE=1指定使用串行模式;=0使用单线程模式;=2使用多线程模式。

sqlite3_threadsafe()函数的返回值可以确定编译时指定的线程模式。如果指定了单线程模式,函数返回false。如果指定了串行或者多线程模式,函数返回true。由于sqlite3_threadsafe()函数要早于多线程模式以及启动时和运行时的模式选择,所以它既不能区别多线程模式和串行模式也不能区别启动时和运行时的模式。

最后一句可通过sqlite3_threadsafe函数的实现来理解@R_902_5607@API int sqlite3_threadsafe(voID){ return @R_902_5607@THREADSAFE; }如果编译时指定了单线程模式,那么临界互斥逻辑在构造时就被省略,因此也就无法在启动时或运行时指定串行模式或多线程模式。

启动时选择线程模式
@H_502_3@ 假如在编译时没有指定单线程模式,就可以在应用程序初始化时@R_772_7251@te3_config()函数修改线程模式。参数@R_902_5607@CONfig_SINGLETHREAD可指定为
单线程模式,@R_902_5607@CONfig_MulTITHREAD指定为多线程模式,@R_902_5607@CONfig_serialiZED指定为串行模式。

运行时选择线程模式 @H_502_3@ 如果没有在编译时和启动时指定为单线程模式,那么每个数据库连接在创建时可单独的被指定为多线程模式或者串行模式,但是不能指定为单线程模式。如果在编译时或启动时指定为单线程模式,就无法在创建连接时指定多线程或者串行模式。 创建连接时用sqlite3_open_v2()函数的第三个参数来指定线程模式。@R_902_5607@OPEN_NOMUTEX标识创建多线程模式的连接;@R_902_5607@OPEN_FulLMUTEX标识创建串行模式的连接。如果没有指定标识,或者@R_772_7251@te3_open()或sqlite3_open16()函数来创建数据库连接,那么在编译时或启动时指定的线程模式将作为默认的线程模式使用。

大佬总结

以上是大佬教程为你收集整理的深入SQLite多线程的使用总结详解全部内容,希望文章能够帮你解决深入SQLite多线程的使用总结详解所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: