Кроме потоков в винде есть еще Fiber (Волокна). Зачем они нужны и какой в них смысл ? С потоками понятно .. есть 8 ядер распаралелили на 8 потоков ..и профит. А фибры что дают на практике ?
Переключение между фиберами - легковесная операция, в отличие от создания новых потоков или переключения между ними. Например, ты выполняешь некую асинхронную операцию (пусть будет чтение большого файла). Если поток может выполнять какую-то полезную работу в это время, ты можешь создать два фибера: в одном отдать команду на чтение, в другом - делать что-то постороннее, и переключаться на первый фибер для проверки, прочитался файл или нет. И всё это с минимальными накладными расходами. Ключевой момент: операции, выполняемые фиберами, должны быть асинхронными (не должны блокировать поток на время их выполнения), иначе на другой фибер ты переключиться не сможешь (т.е., например, делать в одном фибере Sleep, а в другом что-то ещё - нельзя).
В прямом. То, что ты создал 8 потоков, не означает, что они все будут исполняться параллельно на всех 8 ядрах. Как шедулер решит, так они и будут исполняться. Есть там всякие аффинити маски и тд.
Да, вообще, никаких проблем - покупаем себе 1024 ядерный проц, ну или ждем пока такие появятся в продаже.
HoShiMin, > Ключевой момент: операции, выполняемые фиберами, должны быть асинхронными Что за бред ? Фиберы в одном потоке не могут выполнять асинхронные операции, так как поток общий. asmlamo, Это никакого отношения к многопоточности не имеет. Скорее подобие аппаратной многозадачности - переключений контекста. Устроено просто, когда создаётся фибер - создаётся новый стек и настраивается среда для дальнейших переключений контекста(в юзермод разумеется). Когда вызывается апи переключения, то текущий контекст потока переключается(те текущий выгружается в тлс(GPR), загружается связанный с фибером). Контекст это в основном стек, остальное врядле нужно. Это просто смена контекста, юзермод его части, главное стека. Смена стека и создаёт видимость нового потока, так как у каждого треда свой стек. Хитрый трюк. Есть один интересный нюанс - переключение стека на произвольный адрес не допустимо, это OP-атака и такое прибивает ядро, проверяя базу стека которая была при инит треда. Этот механизм позволяет это легально обойти В дий(юзер визор) не использовалось переключение стека именно из за защиты, он смещался вниз. Думаю нужно для транслятора использовать именно эту фишку с фиберами. Хотя с другой стороны не встречал семплов которые чексумму снимают со всего стека.
Что значит "не могут"? Кто помешает вызвать асинхронное чтение из одного фибера, переключиться на другой, затем обратно - и получить прочитанный буфер? Чем это отличается от асинхронного чтения в одном потоке? Асинхронный (overlapped) ReadFile вернёт управление сразу же, и ты свободно можешь переключиться на другой фибер, пока в фоне читается файл.
HoShiMin, Блоки кода последовательно выполняются в одном потоке, а значит синхронно для фиберов одного треда. Асинхронно было бы для двух потоков. Ядерная апи которая сама по себе асинхронна к теме отношения не имеет. Даже если это синхрон IO, то для фидеров одного потока вызовы будут последовательны, какая разница синхрон или нет.