【发布时间】:2013-07-08 00:54:12
【问题描述】:
我的应用程序在多个线程中运行。最多四个线程需要访问我的 sqlite3 数据库。 为了实现这一点,我决定在单独的线程中运行数据库。 在这个线程中,我有一个队列(只是一个字符串向量)。该队列通过来自其他四个工作线程的管道填充。在时间限制或最大值之后。我执行它的队列中的元素数。
这是一个可接受的解决方案吗?或者谁有更好的?
【问题讨论】:
-
有一个消息队列来在线程之间进行通信是很常见的,但为什么会有超时或任何形式的等待呢?如果请求线程想要尽快得到答案怎么办?另外,您如何跟踪哪条消息来自哪个线程,以便将结果发回?
-
如果对数据库的所有请求都是插入|删除|更新 - 没关系(如果不提及关机时的数据丢失)。但是,如果工作线程将等待结果 - 我同意@Joachim Pileborg,则不需要超时。
-
@JoachimPileborg 我每 2 或 3 秒通过工作线程获取一个要插入的值。如果我立即写入这些值,则磁盘上有很多 I/O。如果我丢失了一些值(1 分钟是我的超时),那还不错。但另一件事,如何识别线程以获得可能的结果,我没有想到这个:/ 现在我想不出一个解决方案。能否推荐一些东西或者有一个共同的解决方案?
-
阅读本文sqlite.org/threadsafe.html 您可以使用 1 个线程来批量写入数据库,就像您已经做的那样,每个工作人员有 1 个与数据库的连接,仅用于选择。
-
@GreenScape 感谢您的链接。如果我理解正确,我可以像这样使用 SQLITE_OPEN_FULLMUTEX 标志:
sqlite3_open_v2(Path.c_str(), &DatabaseConnection, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL);我不需要检查我是否已经插入了一些东西?对于其他线程,我会使用 SQLITE_OPEN_READONLY 和 FULLÖMUTEX 标志?
标签: c++ linux multithreading sqlite