Потоки используют с упреждающим планированием , тогда как волокна используют кооперативное планирование.
С потоком поток управления может быть прерван в любое время, и другой поток может вступить во владение. При наличии нескольких процессоров вы можете одновременно запускать несколько потоков ( одновременная многопоточность или SMT). В результате вы должны быть очень осторожными в отношении одновременного доступа к данным и защищать свои данные мьютексами, семафорами, условными переменными и так далее. Часто бывает очень сложно получить права.
При использовании оптоволокна управление переключается только тогда, когда вы указываете это, обычно с вызовом функции с именем что-то вроде yield()
. Это облегчает одновременный доступ к данным, поскольку вам не нужно беспокоиться об атомарности структур данных или мьютексов. Пока вы не уступите, нет опасности быть вытесненным и иметь другое волокно, пытающееся читать или изменять данные, с которыми вы работаете. В результате, однако, если ваше волокно попадает в бесконечный цикл, никакое другое волокно не может работать, так как вы не уступаете.
Вы также можете смешивать нити и волокна, что порождает проблемы, с которыми сталкиваются оба. Не рекомендуется, но иногда это может быть правильным, если все сделано осторожно.