SQLite——C++中的多线程读写

SQLite——C++中的多线程读写,c++,multithreading,sqlite,c++11,C++,Multithreading,Sqlite,C++11,我有一个使用多线程的C++11应用程序。每个线程都可以读取或写入数据库,例如执行插入、更新、删除和选择。 我已经为SQLite启用了序列化模式,所以可以在线程之间共享连接 但是,我不知道如何运行查询。我可以通过sqlite3\u prepare\u v2运行单个查询并创建语句吗?或者,我应该通过std::lock\u guard添加自己的锁,并执行以下操作: Thread #1 db.lock() db.query("....").execute() db.unlock() Thread #2

我有一个使用多线程的C++11应用程序。每个线程都可以读取或写入数据库,例如执行插入、更新、删除和选择。 我已经为SQLite启用了序列化模式,所以可以在线程之间共享连接

但是,我不知道如何运行查询。我可以通过sqlite3\u prepare\u v2运行单个查询并创建语句吗?或者,我应该通过std::lock\u guard添加自己的锁,并执行以下操作:

Thread #1
db.lock()
db.query("....").execute()
db.unlock()

Thread #2
db.lock()
res = db.query("....").select()
while(res) res.row()
db.unlock()
或者还有别的办法吗?我一直在寻找一些示例代码,但什么也没找到。

线程安全意味着单个函数调用是安全的。然而,当来自多个线程的函数调用被交错时,这并不能阻止一个线程修改另一个线程当前通过多个步骤读取的数据;这可能会产生无意义的数据

您必须确保多个线程不会同时尝试对不同事务使用同一连接对象。使用代码中所示的自己的锁,或者为每个线程使用单独的连接对象。

线程安全意味着单个函数调用是安全的。然而,当来自多个线程的函数调用被交错时,这并不能阻止一个线程修改另一个线程当前通过多个步骤读取的数据;这可能会产生无意义的数据

您必须确保多个线程不会同时尝试对不同事务使用同一连接对象。使用代码中所示的自己的锁,或者为每个线程使用单独的连接对象。

在不需要手动锁定的模式下执行查询。根据SQLite文档:

在使用SQLite_THREADSAFE=1编译SQLite时的默认模式下,SQLite库本身将序列化对数据库连接和准备语句的访问,以便应用程序可以在不同线程中同时自由使用相同的数据库连接或相同的准备语句

也可以考虑使用以获得更多并发性。在这种模式下,读写可以同时进行。在连接字符串中包含journal mode=WAL以启用它。

在不需要手动锁定的模式下执行查询。根据SQLite文档:

在使用SQLite_THREADSAFE=1编译SQLite时的默认模式下,SQLite库本身将序列化对数据库连接和准备语句的访问,以便应用程序可以在不同线程中同时自由使用相同的数据库连接或相同的准备语句


也可以考虑使用以获得更多并发性。在这种模式下,读写可以同时进行。在连接字符串中包含journal mode=WAL以启用它。

我认为您不需要互斥。只需建立两个连接并执行查询。db是否序列化服务器端的所有操作?根据,它应该序列化连接和语句。然而,这并不能说明任何关于并发性的问题。@huseyintugrulbuyukisik SQLite没有服务器端。我认为您不需要互斥。只需建立两个连接并执行查询。db是否序列化服务器端的所有操作?根据,它应该序列化连接和语句。然而,这并不能说明任何关于Concurrency的事情。@Huseyintugrulbuyukisk SQLite没有服务器端。嗨,CL,你能更具体一点介绍这个例子吗?这是否意味着每个线程都需要一个db.open?否则您将如何获得单独的连接对象?嗨,CL,您能更具体地介绍一下这个示例吗?这是否意味着每个线程都需要一个db.open?否则如何获得单独的连接对象?