Вопрос с thread / select заключается в том, хотите ли вы, чтобы клиенты не блокировали друг друга. Если это не проблема, то работайте однопоточными. Если это так, выберите подходящую схему потоков (1 поток на соединение, рабочие потоки на соединение, рабочий поток на запрос, ...).
При работе с 1 потоком на соединение выбор для чтения / записи является достойным решением, но, вообще говоря, лучше работать с неблокирующими сокетами в сочетании с выбором, чтобы избежать блокировки в ситуациях, когда только часть ожидаемое сообщение приходит и затем делает выбор после записи.