【发布时间】:2014-10-10 23:58:31
【问题描述】:
这是我的问题的描述:
我的程序中有 2 个线程。一个是主线程,另一个是我使用 pthread_create
创建的主线程在sqlite3 数据库上执行各种功能。每个函数都会打开以执行所需的操作,并在完成后关闭它。
另一个线程只是在设定的时间间隔后从数据库中读取数据并将其上传到服务器上。该线程还打开和关闭数据库以执行其操作。
当两个线程碰巧打开数据库时,就会出现问题。如果一个先完成,它将关闭数据库,从而导致另一个崩溃,从而使应用程序无法使用。 Main 需要用于每个操作的数据库。
有什么办法可以防止这种情况发生吗?互斥锁是一种方法,但如果我使用互斥锁,它会使我的主线程无用。主线程必须始终保持功能,而其他线程在后台运行。
任何使这项工作的建议都会很棒。 我没有提供 sn-ps,因为这个问题有点太大了,但如果你对这个问题一无所知,请告诉我。
编辑:
static sqlite3 *db = NULL;
打开数据库的代码sn-p
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 个字段
【问题讨论】:
-
为什么它会让你的主线程无用?将其与您现在拥有的进行比较,这是一个可能变得无用的整个程序,甚至可能损坏数据库。
-
如果我使用互斥锁并且如果第二个线程获得所有权,我的主线程将无法使用数据库,直到后台线程完成并且用户将无法使用主线程函数
-
SQLite 是否不提供从单个进程到数据库的多个并发连接,正是针对线程应用程序?如果是这样,您应该确保主线程和其他线程各自使用自己的数据库连接。如果它没有提供这样的分离,那么你的多开多关设计是错误的——你的多线程设计可能是错误的(你应该真正使用两个单独的进程而不是在一个进程中使用两个线程)。
-
老实说,我其实没想过要查找并发连接 =) 我会尝试查找相关信息,谢谢
标签: c multithreading sqlite posix shared-resource