В чем смысл запускать на Х-ядерном процессоре более Х потоков? Т.к. одно ядро в 1 момент времени может обрабатывать только 1 операцию, то хоть разбивай программу на потоки, хоть не разбивай - это значит, что программа все-равно быстрее не выполнится, так? Допустим, мне нужно написать прогу для расчета 2х тяжелых операций, вычисление каждой занимает 10 сек. Если я запускаю вычисление обоих операций последовательно в одном потоке, то первая операция рассчитается и ее результат выведется через 10 сек, а результат второй выведется еще через 10 сек (оба результата в сумме будут готовы через 20 сек). Если я создам второй поток для расчета в нем второй операции, то ОС будет постоянно переключаться между двумя этими потоками, второй поток будет постоянно прерывать первый, а первый - второй, в итоге и первый, и второй результаты рассчитаются и выведутся только через 20 секунд оба (т.е получается, что создание второго потока только замедлит общую ситуацию?) Понятие потоков же не недавно появилось, а очень давно, я думаю, что еще в 20 веке, но в середине 2000-х еще продавались компы с одноядерными процами. И я думаю, что уже в середине 2000-х было написано много программ, которые запускали кучу потоков, а выполняли эти проги на одноядерных процах. Вопрос - в чем в этом смысл?? Даже сейчас я, как прогер, вижу в исходниках, да и просто на девелоперских ресурсах куски кода, где запускается куча потоков (бывает что и больше 10 потоков). Но сейчас компы с 2, 4, 8, ядрами (может, и 16 есть, но их точно меньше 1%). Опять таки вопрос - в чем смысл запускать на двухъядерном проце прогу, которая создает больше 2-х потоков? Единственная ситуация, которую я еще понимаю - это когда второй поток (тяжелый) создается для того, чтобы не подвешивать UI-поток (при этом постоянные переключения на UI-поток будут подтормаживать выполнение тяжелого потока, но по-крайней мере UI хотя бы будет реагировать на действия юзера). Но почему кучу потоков создают даже тогда, когда нет никакого UI?
Действительно, в некоторых случаях создание большого количества потоков на многоядерном процессоре может привести к переключениям между потоками и, как следствие, к замедлению работы программы из-за накладных расходов на управление потоками. Однако, есть несколько сценариев, когда использование потоков все же оправдано даже на многоядерном процессоре.
Параллельные вычисления. Если ваша программа выполняет множество вычислительных операций, которые могут быть выполнены независимо друг от друга, то создание потоков для выполнения этих операций параллельно может ускорить работу программы.
Параллельная обработка данных. Если ваша программа работает с большим объемом данных, то разделение обработки этих данных на несколько потоков может ускорить процесс обработки.
Асинхронные операции. Использование потоков может быть оправдано в случае, когда ваша программа выполняет асинхронные операции, например, загрузку данных из сети или работы с файловой системой.
Использование сторонних библиотек. Некоторые библиотеки и фреймворки могут использовать многопоточность для оптимизации работы. В этом случае, создание большого количества потоков может быть необходимо для эффективной работы с этими библиотеками.
Таким образом, хотя излишнее количество потоков на многоядерном процессоре может привести к издержкам на управление потоками, есть сценарии, когда использование потоков все же оправдано и может ускорить работу программы.
Действительно, в некоторых случаях создание большого количества потоков на многоядерном процессоре может привести к переключениям между потоками и, как следствие, к замедлению работы программы из-за накладных расходов на управление потоками. Однако, есть несколько сценариев, когда использование потоков все же оправдано даже на многоядерном процессоре.
Параллельные вычисления. Если ваша программа выполняет множество вычислительных операций, которые могут быть выполнены независимо друг от друга, то создание потоков для выполнения этих операций параллельно может ускорить работу программы.
Параллельная обработка данных. Если ваша программа работает с большим объемом данных, то разделение обработки этих данных на несколько потоков может ускорить процесс обработки.
Асинхронные операции. Использование потоков может быть оправдано в случае, когда ваша программа выполняет асинхронные операции, например, загрузку данных из сети или работы с файловой системой.
Использование сторонних библиотек. Некоторые библиотеки и фреймворки могут использовать многопоточность для оптимизации работы. В этом случае, создание большого количества потоков может быть необходимо для эффективной работы с этими библиотеками.
Таким образом, хотя излишнее количество потоков на многоядерном процессоре может привести к издержкам на управление потоками, есть сценарии, когда использование потоков все же оправдано и может ускорить работу программы.