Потоки Windows имеют достаточно разные функциональные возможности по сравнению с Linux, так что, возможно, вам следует рассмотреть две разные реализации, по крайней мере, если производительность приложения может быть проблемой. С другой стороны, простая реализация многопоточности может сделать ваше приложение медленнее, чем было раньше. Предположим, что производительность - это проблема, и многопоточность - лучший вариант.
В потоках Windows я специально думаю о портах завершения ввода-вывода (IOCP), которые позволяют реализовать потоки, управляемые событиями ввода-вывода, которые позволяют наиболее эффективно использовать оборудование.
Многие «классические» приложения построены по принципу «один поток / один сокет (/ один пользователь или аналогичный)», где количество одновременных сеансов будет ограничено способностью планировщика обрабатывать большое количество потоков (> 1000). Концепция IOCP позволяет ограничить количество потоков количеством ядер в вашей системе, что означает, что планировщику будет очень мало делать. Потоки будут выполняться только тогда, когда IOCP освободит их после того, как произошло событие ввода-вывода. Поток обслуживает IOC (обычно) инициирует новый ввод-вывод и возвращается для ожидания на IOCP следующего завершения. Перед освобождением потока IOCP также предоставит контекст завершения, так что поток "узнает", к какому контексту обработки принадлежит IOC.
Концепция IOCP полностью устраняет опрос, который является большой тратой ресурсов, хотя опрос "ожидание нескольких объектов" является своего рода улучшением. В прошлый раз, когда я посмотрел, в Linux не было ничего похожего на IOCP, поэтому многопоточное приложение для Linux было бы сконструировано совершенно иначе, чем приложение для Windows с IOCP.
В действительно эффективных приложениях IOCP существует риск того, что столько ресурсов ввода-вывода (или, скорее, выходов) будут поставлены в очередь на задействованный ресурс ввода-вывода, так что системе не хватает не выгружаемой памяти для их хранения. И наоборот, в действительно неэффективных приложениях IOCP существует риск того, что столько входов будет поставлено в очередь (ожидающих обслуживания), что при попытке их временной буферизации исчерпается не выгружаемая память.