Блокирующие вызовы блокируют только поток, который их создал, а не весь процесс.
Использовать ли блокирующий ввод / вывод (с одним сокетом на поток) или неблокирующий ввод / вывод (с каждым потоком, управляющим несколькими сокетами) - это то, что вам нужно для сравнения. Но, как правило, ...
Linux обрабатывает несколько потоков достаточно эффективно. Так что, если вы обрабатываете только несколько десятков сокетов, использование одного потока для каждого легко кодируется и должно работать хорошо. Если вы работаете с сотнями сокетов, это более близкий вызов. А для тысяч сокетов вам почти наверняка лучше использовать один поток (или процесс) для управления большими группами.
В последнем случае для оптимальной производительности вы, вероятно, захотите использовать epoll
, даже если это зависит от Linux.