zoukankan      html  css  js  c++  java
  • SQLite3 线程模型

    官网:https://www.sqlite.org/c3ref/open.html

    参考:https://www.cnblogs.com/chechen/p/10956896.html

    https://www.cnblogs.com/feng9exe/p/10682567.html  (这个博主有很多sqlite的文章)

    SQLite 支持三种线程模式:
    1. 单线程模式
        这种模式下,所有互斥锁都被禁用,同一时间只能由一个线程访问,多线程使用不安全。
    2. 多线程模式
        这种模式下,一个连接在同一时间内只有一个线程使用就是安全的。(译注:即不能在多个线程中使用同一个数据库连接)
    3. 串行模式
        这种模式下,开启所有锁,可以随意访问。sqlite是线程安全的。(译注:即在多个线程中不加互斥的使用同一个数据库连接)

     线程模式可以在编译时(通过源码编译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()函数来创建数据库连接,那么在编译时或启动时指定的线程模式将作为默认的线程模式使用。

    只有开启了多线程模型,才能在多线程中发生数据库竞争使用sqlite3_busy_handler() 函数来进行重试

  • 相关阅读:
    jquery判断设备是否是手机
    jQuery -- touch事件之滑动判断(左右上下方向)
    sass制作雪碧图
    js时间字符串转为标准时间
    装箱和拆箱
    Dictionary泛型集合实现山寨版金山词霸
    泛型集合
    ArrayList集合与索引器及Hashtable
    黑马程序员--静态方法和静态类
    黑马程序员--多态练习(手机工厂)
  • 原文地址:https://www.cnblogs.com/Brickert/p/15530568.html
Copyright © 2011-2022 走看看