C++ 如何在多线程应用程序中使用SQLite?
我正在开发一个以as作为数据库的应用程序,在理解如何在多线程中使用它时遇到了一些困难(不幸的是,其他堆栈溢出问题都没有真正帮助我) 我的用例:数据库有一个表,我们称之为“A”,它有不同的行组(基于它们的一列)。我有应用程序的“主线程”,它读取表A中的内容。此外,我决定偶尔更新一组行。为此,我希望生成一个新线程,删除组中的所有行,然后重新插入它们(这是在我的应用程序上下文中执行此操作的唯一方法)。这可能同时发生在不同的组上,因此我可能有2个以上的线程试图更新数据库 我使用来自每个线程的不同事务,即在每个线程的更新周期开始时,我有一个开始。事实上,每个线程实际上所做的是调用“BEGIN”,从数据库中删除它需要“更新”的所有行,并用新值再次插入它们(在我的应用程序上下文中必须这样做) 现在,我正试图了解我是如何实现这一点的。我试着四处阅读(Stack Overflow,SQLite站点上的其他答案),但我没有找到所有答案。以下是我想知道的一些事情:C++ 如何在多线程应用程序中使用SQLite?,c++,multithreading,sqlite,C++,Multithreading,Sqlite,我正在开发一个以as作为数据库的应用程序,在理解如何在多线程中使用它时遇到了一些困难(不幸的是,其他堆栈溢出问题都没有真正帮助我) 我的用例:数据库有一个表,我们称之为“A”,它有不同的行组(基于它们的一列)。我有应用程序的“主线程”,它读取表A中的内容。此外,我决定偶尔更新一组行。为此,我希望生成一个新线程,删除组中的所有行,然后重新插入它们(这是在我的应用程序上下文中执行此操作的唯一方法)。这可能同时发生在不同的组上,因此我可能有2个以上的线程试图更新数据库 我使用来自每个线程的不同事务,即
我希望它有用。开始使用SQLlite进行多线程使用时的一些步骤:
- SQLITE\U LOCKED:如果您从sqlite3\U step语句中获取此信息,则必须在语句句柄上调用sqlite3\U reset。您应该只在第一次调用sqlite3\u步骤时得到这个结果,因此一旦调用了reset,您实际上可以“重试”sqlite3\u步骤调用。在其他操作上,它与SQLITE_BUSY相同
- SQLITE_BUSY:不需要调用sqlite3_reset,只需在等待锁释放一段时间后重试操作
我意识到这是一个古老的线程,响应很好,但我最近一直在研究这个问题,并对一些不同的实现进行了有趣的分析。主要讨论了连接共享、消息传递、线程本地连接和连接池的优缺点。看看这里:SQLite的现代版本默认启用了线程安全。编译标志控制SQLite中是否包含代码,以使其能够在多线程环境中安全运行默认值为
SQLITE\u THREADSAFE=1
。这意味着。我