C++ C+中的SQLite3多线程+;(linux)

C++ C+中的SQLite3多线程+;(linux),c++,linux,multithreading,sqlite,C++,Linux,Multithreading,Sqlite,我的应用程序在几个线程中运行。最多需要四个线程来访问我的sqlite3数据库。 为了实现这一点,我决定在一个单独的线程中运行数据库。 在这个线程中,我有一个队列(仅仅是一个字符串向量)。此队列通过来自其他四个工作线程的管道填充。在一个时间限制或队列中元素的最大数量后,我执行它 这是一个可以接受的解决方案吗?或者有人有更好的消息队列吗?处理消息队列的一种常见方法是实际上有两个队列,一个是发送者添加消息的队列,另一个是回复队列。然后,不用在队列中使用简单的字符串,而是有一个包含数据(您案例中的字符串

我的应用程序在几个线程中运行。最多需要四个线程来访问我的sqlite3数据库。 为了实现这一点,我决定在一个单独的线程中运行数据库。 在这个线程中,我有一个队列(仅仅是一个字符串向量)。此队列通过来自其他四个工作线程的管道填充。在一个时间限制或队列中元素的最大数量后,我执行它


这是一个可以接受的解决方案吗?或者有人有更好的消息队列吗?

处理消息队列的一种常见方法是实际上有两个队列,一个是发送者添加消息的队列,另一个是回复队列。然后,不用在队列中使用简单的字符串,而是有一个包含数据(您案例中的字符串)和队列的结构,在其中添加回复,可能还有某种标识符,以了解回复用于什么消息

随着队列数量的增加,会产生一些额外的内存开销,但考虑到这种方案在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;
}
模板
类消息队列
{
公众:
静态常量消息队列无{};
//使用可选的回复队列向队列发布消息
无效帖子(const Td&data,message_queue&reply_queue=none);
//从队列中获取第一条消息
//该对的第二个成员是可选的消息队列
//在发布回复的地方,如果不需要回复,则为“无”
std::pair get();
//等待消息到达队列
void wait()常量;
私人:
//实际的消息队列

std::queue处理消息队列的一种常见方法是实际上有两个队列,一个是发送方添加消息的队列,另一个是回复队列。然后,不再在队列中使用简单的字符串,而是有一个包含数据的结构(本例中的字符串)以及添加回复的队列,可能还有某种标识符,以了解回复的目的是什么

随着队列数量的增加,会产生一些额外的内存开销,但考虑到这种方案在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;
}
模板
类消息队列
{
公众:
静态常量消息队列无{};
//使用可选的回复队列向队列发布消息
无效帖子(const Td&data,message_queue&reply_queue=none);
//从队列中获取第一条消息
//该对的第二个成员是可选的消息队列
//在发布回复的地方,如果不需要回复,则为“无”
std::pair get();
//等待消息到达队列
void wait()常量;
私人:
//实际的消息队列

SQLite完全支持多线程处理。通过实施您自己的管理系统,您可以提高应用程序的性能和响应能力,但也可能……您不会

您需要了解SQLite多线程的内容。我建议您考虑文档中的信息并做出审慎的决定。

如果您决定制定自己的解决方案,那么可以使用上面文档中的信息来禁用不必要的sqlite内部同步


旁注:在这个问题/答案中有一些有用的信息:

SQLite完全支持多线程。通过实施您自己的管理系统,您可以提高应用程序的性能和响应能力,但也有可能……您不会

您需要了解SQLite多线程的内容。我建议您考虑文档中的信息并做出审慎的决定。

如果您决定制定自己的解决方案,那么可以使用上面文档中的信息来禁用不必要的sqlite内部同步


旁注:在这个问题/答案中有一些有用的信息:

在线程之间有一个消息队列进行通信是很常见的,但是为什么要有一个超时或任何类型的等待?如果请求线程希望尽快得到答案怎么办?另外,您如何跟踪哪个消息来自哪个线程,以便您可以发回消息结果?如果对数据库的所有请求都是INSERT | deletes | updates-这没关系(如果不提关机时的数据丢失)。但如果工作线程将等待结果-我同意@Joachim Pileborg,则不需要超时。@JoachimPileborg我每隔2或3秒从工作线程处获得一个要插入的值。如果我立即写入这些值,磁盘上会有大量I/O。如果我丢失了一些值(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标志?在线程之间使用消息队列进行通信是com