Я довольно новичок в многопользовании, поэтому я не совсем уверен, с чего начать. Проблема появилась в рамках более крупного проекта, и я не совсем уверен, сколько она опирается на остальную часть кода. Я достаточно уверенный в себе класс, и его методы работают правильно, потому что я начал работать над параллельными вычислениями после создания класса и тестирования его до удовлетворения. Объявление в заголовке < /p>
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
останавливается правильно, насколько я могу судить, все другие аргументы передаются правильно.
Объявление
Я довольно новичок в многопользовании, поэтому я не совсем уверен, с чего начать. Проблема появилась в рамках более крупного проекта, и я не совсем уверен, сколько она опирается на остальную часть кода. Я достаточно уверенный в себе класс, и его методы работают правильно, потому что я начал работать над параллельными вычислениями после создания класса и тестирования его до удовлетворения. Объявление в заголовке < /p> [code]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 [/code] останавливается правильно, насколько я могу судить, все другие аргументы передаются правильно. Объявление [code]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);