这是我问题的描述:
我的程序中有 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 个字段
让每个线程使用自己的数据库连接。后台线程没有理由影响主线程的连接。
通常,我希望使用连接池,这样我就不会非常频繁地打开和关闭数据库连接;连接打开是一项昂贵的操作。
在应用程序服务器中,我们经常有许多线程,我们发现几十个连接的连接池足以代表数百个用户为请求提供服务。
基本上内置在sqlite3中,有一些机制可以提供锁定... BEGIN EXCLUSIVE
,您还可以注册睡眠回调,以便其他线程可以执行其他操作...
参见sqlite3_busy_handler((