如何在 C++ 代码中运行多线程

问题描述 投票:0回答:3

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

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

  • 线程二 - 从 dataTwo 向量中获取数据并存储在 dataFour 中

  • Thread main - 在 main 函数中处理 for-loop

有人可以帮我解决这个问题吗?

c++ multithreading c++11 mutex
3个回答
0
投票

只需使用

std::tread
cplusplus 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;
}

0
投票

另一个答案已经直接回答了你的问题。 (我想知道其他地方是否还没有回答这个问题。)

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.