Установите поток в стеке неправильно передавать переменныеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Установите поток в стеке неправильно передавать переменные

Сообщение Anonymous »

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

Код: Выделить всё

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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»