我是c ++的初学者。我编写了一个程序来从一个DB中提取数据并将这些数据存储到另一个DB中。我只是想添加多个线程来加速这个过程。我希望以两种方式做到这一点。
考虑下面的例子。这是一个简单的代码来演示上面的场景。有一个包含大量迭代的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循环
任何人都可以帮我解决这个问题吗?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
The other answer已经直接回答了您的问题。 (我想知道其他地方是否已经回答过了。)
但是,对于您的特定问题(与DB连接),根据具体细节,您可能需要考虑其他选项。例如,很多时候会被浪费掉#34;等待数据传输到/到数据库。另一种方法是使用异步API (如果可用)。然后,单个线程可以处理许多连接。
(如果许多线程只是移动数据,可能会使内存/总线传输容量饱和,并且与单线程一样慢......)
答案 2 :(得分:0)
我是c ++的初学者。我编写了一个程序来从一个DB中提取数据并将这些数据存储到另一个DB中。我只是想添加多个线程来加速这个过程。我希望以两种方式做到这一点。
您可能会以非常无效的方式执行此操作 - 无论您是使用一个线程还是多个线程。假设通过“提取数据”意味着使用DBMS的本机协议或ODBC,这非常慢 - 它需要序列化,打包,通过各种缓冲区,然后是协议的客户端应用程序和反序列化。这忽略了服务器上数据布局更改的潜在开销。 ......而这只是其中的一部分;你再次为第二个DBMS完成整个过程。
您应该尝试使用DBMS的本机/内部导出功能,然后使用其他DBMS导入/批量加载功能。或者,如果第二个DBMS支持第一个本机存储格式,则可以完全避免导出部分。