我是一个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循环
有人能帮我解决这个问题吗?
3条答案
按热度按时间b1uwtaje1#
只需使用
std::tread
:cplusplus std::thread我只是报告这个例子:
tktrz96b2#
The other answer已经直接回答了您的问题。(我想知道这是否还没有在其他地方得到回答。)
然而,对于您的特殊问题(与DB连接),根据具体细节,您可能需要考虑其他选项。例如,等待从/向DB传输数据将“浪费”大量时间。一种替代方法是使用 * 异步API*(如果可用)。这样,一个线程就可以处理多个连接。
(If许多线程只是在移动数据,这可能会使内存/总线传输容量饱和,并且速度与单个线程一样慢...)
6ss1mwsb3#
我是一个c++初学者,我写了一个程序,从一个DB中提取数据,并将这些数据存储到另一个DB中,我只是想添加多个线程来加快这个过程,我希望通过两种方式来实现。
很可能你是在以一种非常低效的方式做这件事--不管你使用一个线程还是多个线程。假设你说的"提取数据"是指使用DBMS的本地协议或ODBC,这是非常慢的--它需要序列化、打包、通过各种缓冲区传输,然后是协议客户端的应用程序和反序列化。而这忽略了服务器上数据布局更改的潜在开销。......这只是其中的一部分;对于第二个DBMS,您将再次执行整个过程。
您确实应该尝试使用DBMS的本地/内部导出功能,然后再使用其他DBMS的导入/批量加载功能。或者,如果第二个DBMS支持第一个DBMS的本地存储格式,则可以完全避免导出部分。