我的applikations在几个主题中运行。最多需要四个线程才能访问我的sqlite3数据库。 为了实现这一点,我决定在一个单独的线程中运行数据库。 在这个线程中,我有一个队列(只是一个字符串向量)。此队列通过其他四个工作线程的管道填充。经过一段时间或最多队列中的元素数量我执行它。
这是一个可以接受的解决方案吗?或者有人有更好的吗?
答案 0 :(得分:4)
SQLite完全支持多线程。通过实施您自己的管理系统,您可以提高应用程序的性能和响应能力,但也可能......您不会。
您需要了解的有关sqlite多线程的所有知识都在sqlite threadsafe documentation中。我建议你考虑该文件中的信息并做出谨慎的决定。
如果您决定制作自己的解决方案,则可以使用上述文档中的信息来禁用不必要的sqlite内部同步。
附注:此问题/答案中有一些有用的信息:How to use SQLite in a multi-threaded application?
答案 1 :(得分:1)
处理邮件队列的常用方法是实际拥有两个队列,一个用于发件人添加其邮件,另一个用于回复。然后,不是在队列中使用简单字符串,而是有一个结构,其中包含数据(在您的情况下为字符串)和添加回复的队列,以及某种标识符,以便知道回复的消息。
随着队列数量的增加,这是一些额外的内存开销,但考虑到这种方案在20世纪80年代中期用于计算机只有512 kb RAM(甚至更少),可以得出结论,开销不是很大。
至于实现,您可以创建一个包含大部分功能的简单类,如果您希望不同的队列能够接收不同的数据,甚至可以将其设为模板类。
也许类似于此:
template<typename Td>
class message_queue
{
public:
static const message_queue<Td> none{};
// Post a message to the queue, with an optional reply queue
void post(const Td& data, message_queue<Td>& reply_queue = none);
// Get the first message from the queue
// The second member of the pair is an optional message queue
// where the reply is posted, it's `none` if no reply needed
std::pair<Td, message_queue<Td>> get();
// Wait for a message to arrive in the queue
void wait() const;
private:
// The actual message queue
std::queue<std::pair<Td, message_queue<Td>> queue;
}
上面的类可以这样使用:
message_queue<std::string> sql_queue;
// ...
message_queue<std::string> reply_queue;
sql_queue.post("SELECT * FROM some_table", reply_queue);
reply_queue.wait();
std::string data = reply_queue.get().first;