Код: Выделить всё
void PropagateElectron(Eigen::Vector3d starting_position, Eigen::Vector3d starting_velocity, Eigen::Vector3d bounding_box_start, Eigen::Vector3d bounding_box_end, double time_step = 1e-13, std::string method = "RK2", bool logging = false);
< /code>
Я пытаюсь параллелизировать моделирование, создавая вектор, содержащий несколько копий этого объекта с различными параметрами < /p>
system base_system(system_template);
std::vector vector_of_systems;
for (int i = 0; i < shift_gap_up.size(); i++) {
vector_of_systems.push_back(base_system);
vector_of_systems[i].Shift(shift_gap_up[i], shift_gap_down[i]);
}
< /code>
Я также создаю стек потоков для управления потоками < /p>
std::stack propagation_threads;`
< /code>
Запуск потоков с помощью: < /p>
for (int i = 0; i < vector_of_systems.size(); i++) {
propagation_threads.emplace(std::thread ([&](system* system) {system->PropagateElectron(electron_start_position, electron_start_velocity, bounding_box_start, bounding_box_end, 1e-13, "RK2"); }, &vector_of_system[i]));
}
< /code>
и сразу после «сбора» их с: < /p>
for (int i = 0; i < vector_of_systems.size(); i++) {
propagation_threads.top().join();
propagation_threads.pop();
}
< /code>
(Коллекция должна была использовать во время цикла, я уже исправил ее в новой функции коллекции, но я публикую оригинальный код сбора) < /p>
Проблема заключается в том, что до тех пор, пока запуск и сборы цикла была в Main (), это работало. Но когда я попытался инкапсулировать их в функции, String Method Объявление
Код: Выделить всё
void LaunchThreads(std::vector & vector_of_undulators, std::stack& propagation_threads, Eigen::Vector3d electron_start_position, Eigen::Vector3d electron_start_velocity, Eigen::Vector3d bounding_box_start, Eigen::Vector3d bounding_box_end, double time_step = 1e-13, std::string method = "RK2", bool logging = false);
void CollectThreads(std::stack& propagation_threads, bool logging = false);
void LaunchAndCollectThreads(std::vector & vector_of_undulators, std::stack& propagation_threads, Eigen::Vector3d electron_start_position, Eigen::Vector3d electron_start_velocity, Eigen::Vector3d bounding_box_start, Eigen::Vector3d bounding_box_end, double time_step = 1e-13, std::string method = "RK2", bool logging = false);
< /code>
Определение < /p>
void LaunchThreads(std::vector& vector_of_undulators, std::stack& propagation_threads, Eigen::Vector3d electron_start_position, Eigen::Vector3d electron_start_velocity, Eigen::Vector3d bounding_box_start, Eigen::Vector3d bounding_box_end, double time_step, std::string method, bool logging) {
if (logging == true) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79579527/emplace-thread-on-stack-doesnt-pass-variables-correctly[/url]