我正在尝试使用sqlite3。我打算在多线程应用程序中使用它来解决线程之间共享的数据的所有锁定和原子性。为了保持加速并且因为我不需要在程序运行之间保存的数据,我正在尝试使用内存数据库,该数据库大部分时间都包含< 100行,最差的是< 500行。
我使用libsqlite3版本3.7.9-2ubuntu1.1在Ubuntu 12.04 x64上运行。
这是我的代码:
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char *argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL);
/* This should never ever happen! */
if (rc != SQLITE_OK) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
rc = sqlite3_exec(db, "CREATE TABLE Players (id int, ip varchar(15), x int, y int);", NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
对于sqlite3_open行,我尝试了很多变化,我有两个问题。当我尝试这些变化时,我在讽刺性地评论为“永远不应该发生”的部分中出现“内存不足”错误:
rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL);
rc = sqlite3_open_v2(":memory:", &db, SQLITE_OPEN_FULLMUTEX, NULL);
当我尝试这个更简单的行时,它通过在磁盘上创建一个名为“file :: memory:?cache = shared”的文件来破坏文档:
rc = sqlite3_open("file::memory:?cache=shared", &db);
我在这里做错了什么?
答案 0 :(得分:2)
您可能需要SQLITE_OPEN_READWRITE
和SQLITE_OPEN_CREATE
标记。
您需要SQLITE_OPEN_URI
标志才能启用URI文件名。
答案 1 :(得分:1)
使用SQLite3作为IPC机制听起来并不实用。创建套接字并使用循环返回接口在线程之间进行通信似乎更实际。此外,如果您不需要在Windows平台上分发,请查看D-bus。
我也不会使用数据库在线程之间共享信息。数据库用于存储大量数据,也许你应该考虑序列化。
protobuf是一个很好的C或C ++序列化库。