美文网首页
多线程下的Sqlite(二) 多线程模式下两个线程使用同一个句柄

多线程下的Sqlite(二) 多线程模式下两个线程使用同一个句柄

作者: 突击手平头哥 | 来源:发表于2019-10-18 23:40 被阅读0次

多线程下的Sqlite(二)

默认为序列化的多线程模型, 本文将对多线程模式下的一些情况做一些测试

函数介绍

SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

参数1为文件名, 参数2传入指向一个数据库句柄指针的指针; 打开数据库, 如果不存在会创建

typedef int (*sqlite3_callback)(void*,int,char**, char**);
SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

执行一条SQL语句, 由sql该参数传入
参数1: 数据库句柄
参数2: sql语句
参数3: 回调函数(暂不做详细介绍)
参数4: 给回调函数传入的参数

两个线程使用同一个句柄进行操作

#include <stdio.h>
#include "sqlite3/sqlite3.h"
#include <thread>

void func1(sqlite3 *db)
{
    int i = 1;

    const char *insert_sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                                "VALUES (1, 'zhangsan', 32, 'China', 100) "; 
    const char *update_sql = "UPDATE COMPANY set SALARY = 200 where ID = 2";

    char *errmsg = NULL;
    while(i < 100)
    {
        errmsg = NULL;
        sqlite3_exec(db, insert_sql, NULL, 0, &errmsg);
        if(errmsg)
        {
            printf("func1 1 %s\n", errmsg);
        }
        errmsg = NULL;
        sqlite3_exec(db, update_sql, NULL, 0, &errmsg);
        if(errmsg)
        {
            printf("func1 2 %s\n", errmsg);
        }
        i++;
    }   
}

void func2(sqlite3 *db)
{
    int i = 1;

    const char *insert_sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                                "VALUES (2, 'zhangsan', 32, 'China', 100) "; 
    const char *update_sql = "UPDATE COMPANY set SALARY = 200 where ID = 1";

    char *errmsg = NULL;
    while(i < 100)
    {
        errmsg = NULL;
        sqlite3_exec(db, insert_sql, NULL, 0, &errmsg);
        if(errmsg)
        {
            printf("func2 1 %s\n", errmsg);
        }
        errmsg = NULL;
        sqlite3_exec(db, update_sql, NULL, 0, &errmsg);
        if(errmsg)
        {
            printf("func2 2 %s\n", errmsg);
        }
        i++;
    }   
}

int main()
{
    int mode = sqlite3_threadsafe();
    sqlite3_config(SQLITE_CONFIG_MULTITHREAD);

    sqlite3 *db; 
    sqlite3_open("E:/debian32.winsf/safe_sqlite/cmake-build-debug/test", &db);

    const char *create_sql = "CREATE TABLE COMPANY("
                                "ID             INT     NOT NULL,"
                                "NAME           TEXT,"
                                "AGE            INT,"
                                "ADDRESS        CHAR(50),"
                                "SALARY         INT);";
    sqlite3_exec(db, create_sql, NULL, 0, NULL);

    std::thread t1(func1, db);
    std::thread t2(func2, db);


    t1.join();
    t2.join();

    sqlite3_close(db);
    system("pause");
    return 0;
}

测试结果
无论Window或者Linux, 直接报出了磁盘错误disk I/O error
我们明确了一点在多线程模式下不应当在不同的线程中使用相同的句柄进行异步操作
当然如果加锁保证顺序依次执行SQL语句, 则不存在问题

相关文章

  • 多线程下的Sqlite(三) 几种模型线程安全的总结

    多线程下的Sqlite(三) 在多线程下每个线程使用各自的句柄 测试结果:频繁: database is lock...

  • 多线程下的Sqlite(二) 多线程模式下两个线程使用同一个句柄

    多线程下的Sqlite(二) 默认为序列化的多线程模型, 本文将对多线程模式下的一些情况做一些测试 函数介绍 参数...

  • sqlite3之SQLITE_OPEN_NOMUTEX与WAL模

    一 . Sqlite多线程概述 SQLite 支持三种线程模式: 1. 单线程模式 这种模式下,没有进行互斥...

  • SQLite多线程安全2

    1、SQLite多线程 SQLite支持三种不同的线程模式: ①单线程(Single-thread) 该模式下,所...

  • 多线程编程

    多线程编程之Linux环境下的多线程(一)多线程编程之Linux环境下的多线程(二)多线程编程之Linux环境下的...

  • 几个小问题

    1、FMDB与多线程 SQLITE默认的线程模式是串行模式, 是线程安全的FMDatabase多线程不安全, 单个...

  • 多线程下的Sqlite(一)

    多线程下的Sqlite 最近在多线程并发执行的情况下, 碰到了database is lock导致操作被驳回 Sq...

  • 线程

    语法 多线程工作在单进程下。在多线程模式下,数据变量是被所有线程共享的。 1.创建线程 当两个处理函数同时操作一个...

  • FMDB与多线程的研究

    前言SQLITE线程安全, 与FMDB多线程安全是两回事;SQLITE默认的线程模式是串行模式, 是线程安全的FM...

  • Linux多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread。编写Linux下的多线程程序,需要使用头文件...

网友评论

      本文标题:多线程下的Sqlite(二) 多线程模式下两个线程使用同一个句柄

      本文链接:https://www.haomeiwen.com/subject/roxgmctx.html