суббота, 15 апреля 2017 г.

C++: Использование std::vector как dynamic array

Я вот здесь уже писал, как лучше организовывать многотредовое выполнение (нет, это не пул тредов, пул тредов несколько сложнее. Хотя этот кусок можно использовать внутри кода пула тредов, да. По частям. Для инициализации пула и его деструкции).

Так вот. Найдено наилучшее и наиболее элегантное решение. :)

      v_threads.resize(v_max_threads);  
      /*-------------Main Loop----------------*/  
      while (!std::cin.eof()) {  
           /* Start processing threads */  
           for (auto &t : v_threads) {  
                t = std::thread([]() { processdata(); });  
           }  
           /* Finish all threads */  
           for (auto &t : v_threads) {  
                t.join();  
           }  
      }  
      /*-------------Main Loop----------------*/  
   

Никаких push/emplace_back, никаких clear(). Вектор используется как array, причем с лучшими чертами динамических массивов и std::array.

Адресация элементов уже инициализированного вектора (resize вместо reserve) работает быстрее, чем push_back (примерно в четыре раза), и, хотя resize() и медленнее, чем reserve(), но она находится вне цикла и выполняется только один раз.