Я разрабатываю кросс-платформенное приложение (Windows, Linux и Android) C++, которое должно отправлять нагрузку. Эта рабочая нагрузка должна быть отправлена по отдельному потоку, и существует возможность для асинхронного представления нескольких рабочих нагрузок. Приложение работает по потоку, а не по основному потоку, который выполняет скрипт. Этот скрипт, в свою очередь, будет выполнять представления рабочей нагрузки для дополнительных потоков. Время не критично в этом приложении, так как рабочая нагрузка работает на аппаратном эмуляторе.
Если приложение было критическим по времени, я бы предварительно создал пул потоков и циклично отправлял представления по потокам, нити, которые никогда не выходят... однако, поскольку инструмент не критичен по времени и никогда не будет, я рассматриваю возможность создания новых потоков и разрешения они истекают по каждому представлению исключительно для простоты и расписания.
Я пытаюсь определить, считается ли это хорошей практикой? Я также пытаюсь определить последствия для каждой ОС: EG Это может быть хорошо в Windows, но может возникнуть проблема с Android версии 4.2, о которой я не знаю.
Если я не буду постоянно создавать новые потоки при каждой отправке, то я ищу твердые причины, почему это не должно быть сделано. Спасибо за ваш вклад. PS Я не смог найти ответ в поиске.
Создание потоков по требованию и их истечение при представлении может показаться простым, и, как и другие комментаторы, это часто делается. Я почти никогда не делаю такого по следующим причинам:
Вы должны фактически создавать потоки и правильно их завершать. Это может быть нетривиальным и подвержено ошибкам - поиск SO для "прекратить поток" сообщений - есть тысячи. Проблемы с завершающими потоками можно избежать, не завершая их.
Не только создание/завершение потоков гораздо более дорогостоящим с точки зрения фактического создания/завершения потоков, но любые классы, используемые потоком /s, должны постоянно создаваться и уничтожаться. Это может быть дорогостоящим для некоторых классов, и ошибки в dtors могут привести к все возрастающей утечке памяти (классы в непрозрачных библиотеках, которые вы не можете исправить, как известно, течет :). Этого можно избежать, не прерывая нити и избегая разрушения таких объектов.
Для создания потока требуется, чтобы его стек был выделен. Многие ОС выделяют слишком большие стеки по умолчанию, которые потребляют пространство виртуальной памяти. Это может быть проблемой с "взрывными" рабочими нагрузками, когда внезапное прибытие большой партии работы может привести к смехотворному большому количеству потоков и исчезновению памяти.
Если вы находитесь в неудачной позиции, чтобы поделиться некоторыми ресурсами по потокам, чем больше потоков, тем больше у вас будет конфликтов на этих ресурсах, поэтому увеличивается время ожидания блокировок.
Неизвестное количество потоков делает отладку, которая уже сложна при многопоточности, еще сложнее. Это для меня основное внимание, и я сделаю почти все, чтобы избежать множественных шаблонов create/terminate/join.
Создание/завершение/присоединение печально известно, что оно предотвращает быстрое завершение работы приложений. Если у вас на вашем компьютере были плохо настроенные графические приложения, которые не сразу закрываются по запросу (и я уверен, что у вас есть), join(), вероятно, станет причиной.
Отправка задач в пулы потоков намного безопаснее и будет предпочтительнее.
Время жизни приложения-приложения, т.е. созданные при запуске приложения, посвящены какой-то задаче и никогда не завершаются, также прекрасны, и для некоторых функций, таких как ведение журнала, больше подходят, чем задачи threadpool.
Многократное создание/завершение/соединение? Просто попробуйте очень, очень трудно избежать этого. Поместите этот шаблон в категорию "отчаяние" :)