簡體   English   中英

如何在C ++代碼中運行多個線程

[英]How to run multiple threads in C++ code

我是C ++的初學者。 我編寫了一個程序來從一個數據庫中提取數據並將這些數據存儲到另一個數據庫中。 我只想添加多個線程以加快該過程。 我希望以兩種方式做到這一點。

  1. 從第一個數據庫中提取數據並將這些數據存儲在內存中。 (在這種情況下,我需要將這些數據分為兩種std :: vector類型)
  2. 從數據庫中提取數據時,如果向量大小大於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時,應該有三個線程在運行,

  • 線程一-從dataOne向量中獲取數據並存儲在data3中

  • 線程二-從dataTwo向量獲取數據並存儲在dataFour中

  • 線程主線程-在主函數中處理for循環

任何人都可以幫助我解決這個問題?

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

另一個答案已經直接回答您的問題。 (我想知道這是否還沒有在其他地方得到回答。)

但是,對於特定的問題(與數據庫連接),根據確切的詳細信息,您可能需要考慮其他選項。 例如,大量時間將被“浪費”,等待數據往返於DB。 另一種方法是使用異步API (如果有)。 然后,一個線程可以處理許多連接。

(如果許多線程只是在移動數據,則可能會使內存/總線傳輸容量飽和,並且速度與單線程一樣慢...)

我是C ++的初學者。 我編寫了一個程序來從一個數據庫中提取數據並將這些數據存儲到另一個數據庫中。 我只想添加多個線程以加快該過程。 我希望以兩種方式做到這一點。

無論您使用一個還是多個線程,您都可能以非常無效的方式執行此操作。 假設“提取數據”是指使用DBMS的本機協議或ODBC,這將非常慢-它需要序列化,打包,通過各種緩沖區傳輸,然后需要協議客戶端的應用和反序列化。 並且這忽略了服務器上數據布局更改的潛在開銷。 ...而這只是其中的一部分; 您將在第二個DBMS中再次經歷整個過程。

您實際上應該嘗試使用DBMS的本機/內部導出功能,然后再使用其他DBMS導入/批量加載功能。 或者,如果第二個DBMS支持第一個的本機存儲格式,則可以完全避免導出部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM