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

vi4fp9gy  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(170)

我是一个c++初学者,我写了一个程序,从一个DB中提取数据,并将这些数据存储到另一个DB中,我只是想添加多个线程来加快这个过程,我希望通过两种方式来实现。
1.从第一个DB中提取数据并将这些数据存储在内存中。(在本例中,我需要将这些数据存储在两个std::vector类型中)
1.当从数据库中提取数据时,如果向量大小大于10000,则需要调用和启动两个线程,从两个向量(分别)获取数据,并将这些数据存储在第二数据库中。
考虑下面的例子。这是一个简单的代码来演示上面的场景。有一个for循环,有大量的迭代。我需要为这段代码启动两个线程,以便从dataOne和dataTwo向量中提取数据(两个线程是分开的),并在i = 10000时将这些数据存储在dataThree和dataFour向量中。
使用命名空间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时,应该有三个线程在运行,

  • 线程1-从dataOne向量获取数据并存储到dataThree
  • 线程2-从dataTwo获取数据向量并存储在dataFour中
  • 线程main-处理main函数中的for循环

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

b1uwtaje

b1uwtaje1#

只需使用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;
}
tktrz96b

tktrz96b2#

The other answer已经直接回答了您的问题。(我想知道这是否还没有在其他地方得到回答。)
然而,对于您的特殊问题(与DB连接),根据具体细节,您可能需要考虑其他选项。例如,等待从/向DB传输数据将“浪费”大量时间。一种替代方法是使用 * 异步API*(如果可用)。这样,一个线程就可以处理多个连接。
(If许多线程只是在移动数据,这可能会使内存/总线传输容量饱和,并且速度与单个线程一样慢...)

6ss1mwsb

6ss1mwsb3#

我是一个c++初学者,我写了一个程序,从一个DB中提取数据,并将这些数据存储到另一个DB中,我只是想添加多个线程来加快这个过程,我希望通过两种方式来实现。
很可能你是在以一种非常低效的方式做这件事--不管你使用一个线程还是多个线程。假设你说的"提取数据"是指使用DBMS的本地协议或ODBC,这是非常慢的--它需要序列化、打包、通过各种缓冲区传输,然后是协议客户端的应用程序和反序列化。而这忽略了服务器上数据布局更改的潜在开销。......这只是其中的一部分;对于第二个DBMS,您将再次执行整个过程。
您确实应该尝试使用DBMS的本地/内部导出功能,然后再使用其他DBMS的导入/批量加载功能。或者,如果第二个DBMS支持第一个DBMS的本地存储格式,则可以完全避免导出部分。

相关问题