【发布时间】:2017-01-15 10:42:49
【问题描述】:
我正在开发一个使用 SQLite 作为后端的程序(使用在 Linux 机器上运行的 C++)。
它有 2 个线程执行以下任务:
-
线程 1
- 等待一段数据到达(在这种情况下,通过无线电模块)
- 立即将其插入数据库中
- 返回等待新数据
- 重要的是,该线程尽可能多地“侦听”并且不会阻塞等待插入数据库
-
线程 2
- 每 2 分钟对数据库运行一次 SELECT 以查找未处理的数据
- 处理数据
- 使用标志更新获取的行以显示它们已被处理
关键是要确保线程 1 始终可以插入到数据库中,即使这意味着线程 2 无法选择或更新(因为这可能会在未来发生,所以时间不是危急)。
我希望找到一种使用 SQLite 以某种方式对 INSERT 进行优先级排序的方法,但到目前为止还没有找到方法。另一个想法是线程 1 将数据推送到基本队列(保存在内存中),然后每隔一段时间批量插入(因为这不会阻止数据的接收,并且可以做一个简单的检查以查看数据库被锁定,如果是,请等待几毫秒,然后重试)。
但是,使用 SQLite 和 C++ 线程执行此操作的“正确”方法是什么?
【问题讨论】:
-
您用来与数据库通信的 API 是否支持异步调用?
-
不要使用线程 1 插入数据库 - 使用内存队列并从线程 1a 插入。回复:多线程见sqlite.org/threadsafe.html
-
谢谢,我正在探索队列选项。如果数据量增加,这似乎是最具可扩展性的版本
标签: c++ multithreading sqlite