繁体   English   中英

C多线程-通过2个线程崩溃Sqlite3数据库访问

[英]C Multithreading - Sqlite3 database access by 2 threads crash

这是我的问题的描述:

我的程序中有2个线程。 一个是主线程,另一个是我使用pthread_create创建的线程

主线程在sqlite3数据库上执行各种功能。 每个功能都会打开以执行所需的操作,并在完成后将其关闭。

另一个线程在设置的时间间隔后简单地从数据库读取,并将其上载到服务器。 该线程还打开和关闭数据库以执行其操作。

当两个线程碰巧都打开数据库时,会发生此问题。 如果第一个完成,它将关闭数据库,从而导致另一个崩溃,使应用程序无法使用。 Main每次操作都需要数据库。

有什么方法可以防止这种情况发生吗? 互斥锁是一种方法,但是如果我使用互斥锁,它将使我的主线程无用。 主线程必须始终保持功能正常,而其他线程则在后台运行。

任何建议,使这项工作将是巨大的。 我没有提供摘要,因为这个问题太大了,但是如果您对这个问题不了解,请告诉我。

编辑:

static sqlite3 *db = NULL;

用于打开数据库的代码段

int open_database(char* DB_dir) // argument is the db path
        rc = sqlite3_open(DB_dir , &db); 

        if( rc )                
        {
//failed to open message
            sqlite3_close(db); 
            db = NULL;
            return SDK_SQL_ERR;
        }
        else
        {
            //success message
        }
    }
    return SDK_OK;

}

并关闭db

int close_database()
{
    if(db!=NULL)
    {
        sqlite3_close(db);
        db = NULL;
        //success message
    }
    return 1;
}

编辑:我忘了补充说,后台线程执行一个写入操作,该操作为表上载到服务器的每一行更新表的1个字段

让您的线程各自使用自己的数据库连接。 后台线程没有理由影响主线程的连接。

通常,我想使用连接池,这样我就不会非常频繁地打开和关闭数据库连接。 连接打开是一项昂贵的操作。

在应用服务器中,我们经常有很多线程,我们发现只有几十个连接的连接池足以代表数百个用户处理请求。

基本内置于sqlite3中的机制提供锁定... BEGIN EXCLUSIVE然后您还可以注册一个sleep回调,以便其他线程可以执行其他操作...

参见sqlite3_busy_handler()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM