Отличается ли выполнение потока в среде IDE и как в приложении exe в C++?
Я новичок в C++ Threading. Я разработал многопоточное приложение на C++11 с использованием блоков Code:.
Приложение начинает работать и отлично работать (запуск программы, разделяет задачу на потоки, после завершения задачи, затем печатает информацию и затем завершается) из кодовых блоков.
Но после генерации exe-файла с использованием блоков кода и отдельного запуска exe-файла из командной строки программа работает, как и раньше, до тех пор, пока задача не будет завершена, но по завершении всей задачи потоки не смогут выйти и перейти к следующему шагу.,
Запуск программы внутри кода: блоки и снаружи должны быть одинаковыми. Ниже я добавил функцию деления задачи, которая выполняет резьбовую функцию. Я использовал moodycamel::ConcurrentQueue
для функции ниже.
void divide_task(){
std::atomic<int> doneConsumers(0);
std::thread threads[cores_aval];
for (int i = 0; i != cores_aval; ++i) {
threads[i] = std::thread([&]() {
Item* item = new Read;
do{
while (con_read_q.try_dequeue(item)) {
//do something with hitem;
delete item;
}
}
while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == cores_aval);
});
}
}
Обновление: спасибо за ответы. Я обнаружил проблему с настройками параметров сборки в кодовых блоках. Один из флагов компилятора в ветви релиза влиял на конечный exe-файл, который уменьшал размер файла за счет удаления символов.
1 ответ
Синхронизация между потоками, вероятно, различается при работе в IDE и за ее пределами, что может быстрее выявить условия гонки в одной среде по сравнению с другой.
Сборка с / без оптимизации также изменит время и может также выявить ошибки.
В любом случае, без SSCCE невозможно сказать, что не так в вашем случае, но мой хрустальный шар говорит, что у вас, вероятно, есть гонка данных в вашем коде.
Вы уверены, что это while (con_read_q.try_dequeue(item)
Поток безопасен?