Поток ядра означает поток, за который ядро отвечает за планирование.Это означает, помимо прочего, что ядро может планировать каждый поток на разных процессорах / ядрах одновременно.
Как их использовать, сильно зависит от языков программирования и API потоков, но в простом видеиллюстрация,
void task_a();
void task_b();
int main() {
new_thread(task_a);
new_thread(task_b);
// possibly do something else in the main thread
// wait for the threads to complete their work
}
В каждой знакомой мне реализации ядро может приостановить их в любое время.(«упреждающий»)
Пользовательские потоки или «Пользовательские запланированные потоки» делают саму программу ответственной за переключение между ними.Есть много способов сделать это, и, соответственно, существует множество названий для них.
На одном конце у вас есть «Зеленые нити»;в основном пытается сделать то же самое, что и потоки ядра.Таким образом, вы сохраняете все сложности программирования с реальными потоками.
На противоположном конце у вас есть «Волокна», которые необходимы для того, чтобы сдаться до запуска любого другого волокна.Это означает, что
- Волокна проходят последовательно.Нет никакого увеличения производительности параллеля.
- Взаимодействие между волокнами очень хорошо определено.Другой код выполняется только в точных точках, которые вы получаете.Другой код не будет изменять переменные, пока вы над ними работаете.
- Большинство программистов с низкоуровневыми сложностями борются с многопоточностью, такой как когерентность кэша (большинство пользователей обращают внимание на вопросы MT на этом сайте.не понимаю), не являются фактором.
В качестве простейшего примера волокон я могу представить:
while(tasks_not_done) {
do_part_of_a();
do_part_of_b();
}
, где каждый выполняет некоторую работу, а затем возвращается, когдаэта часть сделана.Обратите внимание, что они выполняются последовательно в одном и том же «аппаратном потоке», что означает, что вы не получите увеличения производительности от параллелизма.С другой стороны, взаимодействия между ними очень хорошо определены, поэтому у вас нет условий гонки.Фактическая работа каждой функции может варьироваться.Они также могут быть «объектами пользовательских потоков» из некоторого вектора / массива.