我有一个C ++程序,其中我有多个线程写入单个数据库的SQLite表(启用了WAL模式)。每个线程创建一个SQLite句柄,执行sqlite3_open(),写入表(在事务中写入),然后执行sqlite3_close(),然后删除SQLite句柄。然后线程就死了。
即使在所有线程都死掉之后,SQLite句柄仍然处于打开状态。为什么SQLite句柄没有关闭?我在这里缺少什么?
我的C ++程序在CentOS 5.5上运行。
[编辑]
这是我使用pthread
void threadFunction(void* pArg) {
sqlite3 *handle;
sqlite3_open("a.cm", &handle);
printf("Worker thread - Opened \n");
sleep(10);
int r = sqlite3_close(handle);
printf("Ret: %d\n", r);
printf("Worker thread - Closed \n");
}
int main() {
int i(0);
pthread_t thread1, thread2;
printf("Creating a worker thread\n");
printf("SQLite libversion: %s\n", sqlite3_libversion());
sqlite3 *handle;
sqlite3_open("a.cm", &handle);
sqlite3_exec(handle, "pragma journal_mode = WAL", NULL, NULL, NULL);
printf("Main thread - Opened \n");
pthread_create(&thread1, NULL, threadFunction, NULL);
pthread_create(&thread2, NULL, threadFunction, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
sleep(200);
sqlite3_close(handle);
printf("Main thread - close \n");
return 0;
}
答案 0 :(得分:2)
联系SQLite团队:这是他们的回复 -
关闭一个连接时(在WAL
模式下),
SQLite检查进程中是否有任何其他连接
正在关闭的数据库文件上的POSIX锁定。如果是这样,那就推迟了
关闭文件句柄,直到另一个连接断开它
POSIX锁(如果还有另一个文件描述符将被重用
打开与同一文件的连接,但不然
等待它可以安全关闭)。
结论是: 所以直到从main()函数关闭连接 从其他线程打开的句柄不会被关闭!