单线程:这类形式下,没有举行互斥,多线程运用不平安。禁用一切的mutex锁,并发运用时会失足。当SQLite编译时加了SQLITE_THREADSAFE=0参数,或许在初始化SQLite前挪用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用。
多线程:这类形式下,只需一个数据库衔接不被多个线程同时运用就是平安的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库衔接和prepared statement(准备好的语句)上的锁,因而不能在多个线程中并发运用同一个数据库衔接或prepared statement。当SQLite编译时加了SQLITE_THREADSAFE=2参数时默许启用。若SQLITE_THREADSAFE不为0,能够在初始化SQLite前,挪用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用;或许在建立数据库衔接时,设置SQLITE_OPEN_NOMUTEX flag。
串行:sqlite是线程平安的。启用一切的锁,包含bCoreMutex和bFullMutex 。因为数据库衔接和prepared statement都已加锁,所以多线程运用这些对象时没法并发,也就变成串行了。当SQLite编译时加了SQLITE_THREADSAFE =1参数时默许启用。若SQLITE_THREADSAFE不为0,能够在初始化SQLite前,挪用sqlite3_config(SQLITE_CONFIG_SERIALIZED)启用;或许在建立数据库衔接时,设置SQLITE_OPEN_FULLMUTEX flag 。
而这里所说的初始化是指挪用sqlite3_initialize()函数,这个函数在挪用sqlite3_open()时会自动挪用,且只要第一次挪用是有用的.
为了到达线程平安,SQLite在编译时必须将 SQLITE_THREADSAFE 预处理宏置为1。在Windows和Linux上, 已编译的好的二进制发行版中都是如许设置的。如果不肯定你所运用的库是不是是线程平安的,能够挪用 sqlite3_threadsafe() 接口找出。挪用sqlite3_threadsafe()能够获得编译期的SQLITE_THREADSAFE参数 。
也就是说线程形式能够在编译时(经由过程源码编译sqlite库时)、启动时(运用sqlite的应用程序初始化时)或许运行时(建立数据库衔接时)来指定。一般而言,运行时指定的形式将掩盖启动时的指定形式,启动时指定的形式将掩盖编译时指定的形式。然则,单线程形式一旦被指定,将没法被掩盖。默许的线程形式是串行形式。
编译时挑选线程形式
能够经由过程定义SQLITE_THREADSAFE宏来指定线程形式。如果没有指定,默许为串行形式。定义宏SQLITE_THREADSAFE=1指定运用串行形式;=0运用单线程形式;=2运用多线程形式。
sqlite3_threadsafe()函数的返回值能够肯定编译时指定的线程形式。如果指定了单线程形式,函数返回false。如果指定了串行或许多线程形式,函数返回true。因为sqlite3_threadsafe()函数要早于多线程形式以及启动时和运行时的形式挑选,所以它既不能区分多线程形式和串行形式也不能区分启动时和运行时的形式。
末了一句可经由过程sqlite3_threadsafe函数的完成来明白SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }如果编译时指定了单线程形式,那末临界互斥逻辑在组织时就被省略,因而也就没法在启动时或运行时指定串行形式或多线程形式。
启动时挑选线程形式
如果在编译时没有指定单线程形式,就能够在应用程序初始化时运用sqlite3_config()函数修正线程形式。参数SQLITE_CONFIG_SINGLETHREAD可指定为
单线程形式,SQLITE_CONFIG_MULTITHREAD指定为多线程形式,SQLITE_CONFIG_SERIALIZED指定为串行形式。
运行时挑选线程形式
如果没有在编译时和启动时指定为单线程形式,那末每一个数据库衔接在建立时可零丁的被指定为多线程形式或许串行形式,然则不能指定为单线程形式。如果在编译时或启动时指定为单线程形式,就没法在建立衔接时指定多线程或许串行形式。
建立衔接时用sqlite3_open_v2()函数的第三个参数来指定线程形式。SQLITE_OPEN_NOMUTEX标识建立多线程形式的衔接;SQLITE_OPEN_FULLMUTEX标识建立串行形式的衔接。如果没有指定标识,或许运用sqlite3_open()或sqlite3_open16()函数来建立数据库衔接,那末在编译时或启动时指定的线程形式将作为默许的线程形式运用。
以上就是深切SQLite多线程的运用总结详解的内容,更多相关内容请关注ki4网(www.ki4.cn)!