Как запустить несколько потоков в коде C ++ - PullRequest
0 голосов
/ 26 мая 2018

Я новичок в C ++.Я написал программу для извлечения данных из одной БД и сохранения этих данных в другой БД.Я просто хочу добавить несколько потоков, чтобы ускорить процесс.Я надеюсь сделать это двумя способами.

  1. Извлечение данных из первой БД и сохранение этих данных в памяти.(В этом случае мне нужны эти данные в двух std :: vector типах)
  2. при извлечении данных из базы данных, если размер вектора больше 10000 необходимо запустить два потока и запустить их, получить данные из двух векторов (отдельно) и сохранить эти данные во второй базе данных.

Рассмотрим приведенный ниже пример.Это простой код для демонстрации вышеуказанного сценария.Есть цикл for с огромными итерациями.Мне нужно запустить два потока для этого кода, чтобы извлечь данные из векторов dataOne и dataTwo (отдельные потоки для обоих) и сохранить эти данные в векторах dataThree и dataFour, когда i = 10000 .

с использованием пространства имен 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 должно быть запущено три потока,

  • Thread one - получение данных из dataOneвектор и сохранение в dataThree

  • Thread два - получение данных из dataTwo и сохранение в dataFour

  • Thread main - обработка цикла for вОсновная функция

Кто-нибудь может помочь мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Другой ответ уже отвечает на ваш вопрос напрямую.(И мне интересно, если это не было ответа в другом месте.)

Однако, для вашей конкретной проблемы (соединение с БД), в зависимости от точных деталей, вы можете рассмотреть другие варианты.Например, много времени будет «потрачено впустую» в ожидании передачи данных из / в БД.Альтернативой является использование асинхронного API , если он доступен.Затем один поток может обрабатывать множество соединений.

(Если многие потоки просто перемещают данные, это может привести к насыщению памяти и пропускной способности шины и быть таким же медленным, как у одного потока ...)

0 голосов
/ 26 мая 2018

Я новичок в C ++.Я написал программу для извлечения данных из одной БД и сохранения этих данных в другой БД.Я просто хочу добавить несколько потоков, чтобы ускорить процесс.Я надеюсь сделать это двумя способами.

Вероятно, вы делаете это крайне неэффективно - используете ли вы один поток или несколько.Предполагая, что под «извлечением данных» вы подразумеваете использование собственного протокола СУБД или ODBC, это происходит крайне медленно - для этого требуется сериализация, пакетирование, прохождение через различные буферы, затем применение протокола на стороне клиента и десериализация.И это игнорирует потенциальные накладные расходы на изменения макета данных на сервере.... и это только одна часть;Вы снова проделываете все это для второй СУБД.

Вам действительно следует попытаться использовать встроенную / внутреннюю функцию экспорта СУБД, а затем другую функцию импорта / массовой загрузки СУБД.В качестве альтернативы, если вторая СУБД поддерживает собственный формат хранения первой, вы можете вообще избежать части экспорта.

0 голосов
/ 26 мая 2018

Просто используйте 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;
}
...