如何在C ++代码

时间:2018-05-26 18:11:18

标签: c++ multithreading c++11 mutex

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

  1. 从第一个数据库中提取数据并将这些数据存储在内存中。 (在这种情况下,我需要两个 std :: vector 类型中的那些数据)
  2. 从数据库中提取数据时,如果向量大小超过10000 ,则需要调用两个线程并需要启动,从两个向量中获取数据(单独)并在第二个中存储这些数据数据库中。
  3. 考虑下面的例子。这是一个简单的代码来演示上面的场景。有一个包含大量迭代的for循环。我需要为此代码启动两个线程以从dataOne和dataTwo向量(两者的单独线程)中提取数据,并在 i = 10000 。

    使用namespace std;

    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时,应该有三个线程在运行,

    • 第一个线程 - 从dataOne向量获取数据并存储在dataThree中

    • 第二个主题 - 从dataTwo向量获取数据并存储在dataFour中

    • 线程主 - 处理主函数中的for循环

    任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

只需使用std::treadcplusplus std::thread

我只是举例说明:

// thread example
#include <iostream>       // std::cout
#include <thread>         // std::thread

void foo() 
{
  // do stuff...
}

void bar(int x)
{
  // do stuff...
}

int main() 
{
  std::thread first (foo);     // spawn new thread that calls foo()
  std::thread second (bar,0);  // spawn new thread that calls bar(0)

  std::cout << "main, foo and bar now execute concurrently...\n";

  // synchronize threads:
  first.join();                // pauses until first finishes
  second.join();               // pauses until second finishes

  std::cout << "foo and bar completed.\n";

  return 0;
}

答案 1 :(得分:0)

The other answer已经直接回答了您的问题。 (我想知道其他地方是否已经回答过了。)

但是,对于您的特定问题(与DB连接),根据具体细节,您可能需要考虑其他选项。例如,很多时候会被浪费掉#34;等待数据传输到/到数据库。另一种方法是使用异步API (如果可用)。然后,单个线程可以处理许多连接。

(如果许多线程只是移动数据,可能会使内存/总线传输容量饱和,并且与单线程一样慢......)

答案 2 :(得分:0)

  

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

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

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