0

这是我的问题的描述:

我的程序中有 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;

}

并关闭数据库

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

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

4

2 回答 2

2

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

一般来说,我希望使用连接池,这样我就不会频繁地打开和关闭数据库连接;连接打开是一项昂贵的操作。

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

于 2014-08-18T06:02:28.253 回答
0

基本上内置于 sqlite3 有提供锁定的机制......BEGIN EXCLUSIVE然后你也可以注册一个睡眠回调,以便其他线程可以做其他事情......

sqlite3_busy_handler()

于 2014-08-18T14:01:23.847 回答