首页 > 解决方案 > 如何在 C++ 代码中运行多个线程

问题描述

我是 C++ 的初学者。我编写了一个程序来从一个数据库中提取数据并将这些数据存储到另一个数据库中。我只想添加多个线程来加快进程。我希望通过两种方式做到这一点。

  1. 从第一个数据库中提取数据并将这些数据存储在内存中。(在这种情况下,我需要两种std::vector类型的数据)
  2. 在从数据库中提取数据时,如果向量大小超过 10000,则需要调用两个线程并需要启动,从两个向量中(分别)获取数据并将这些数据存储在第二个数据库中。

考虑下面的例子。这是一个简单的代码来演示上述场景。有一个具有大量迭代的 for 循环。我需要为此代码启动两个线程以从 dataOne 和 dataTwo 向量中提取数据(两者都是单独的线程),并在i = 10000时将这些数据存储在 dataThree 和 dataFour 向量中。

使用命名空间标准;

int main(){

   std::vector<std::vector<int>> dataOne;
   std::vector<std::vector<int>> dataTwo;

   std::vector<std::vector<int>> dataThree;
   std::vector<std::vector<int>> dataFour;

   for(int i=0; i < 10000000; i++){
       std::vector<int> temp = {1,2,3};
       dataOne.push_back(temp);          //store data in vector-one 

       std::vector<int> temp2 = {3,4,5};
       dataTwo.push_back(temp2);        //store data in vector-two      
   }
}

当 i=10000 时,应该有三个线程在运行,

谁能帮我解决这个问题?

标签: c++multithreadingc++11mutex

解决方案


我是 C++ 的初学者。我编写了一个程序来从一个数据库中提取数据并将这些数据存储到另一个数据库中。我只想添加多个线程来加快进程。我希望通过两种方式做到这一点。

无论您使用一个线程还是多个线程,您都可能以一种非常无效的方式执行此操作。假设“提取数据”是指使用 DBMS 的本机协议或 ODBC,这非常慢 - 它需要序列化、打包、通过各种缓冲区,然后是协议客户端的应用程序和反序列化。这忽略了服务器上数据布局更改的潜在开销。...这只是其中的一部分;您再次为第二个 DBMS 完成整个过程。

您真的应该尝试使用 DBMS 的本机/内部导出功能,然后使用其他 DBMS 导入/批量加载功能。或者,如果第二个 DBMS 支持第一个的本机存储格式,您也许可以完全避免导出部分。


推荐阅读