Muitos threads ou o menor número possível de threads?

Como projeto paralelo, atualmente estou escrevendo um servidor para um jogo antigo que costumava jogar. Estou tentando tornar o servidor o menos acoplado possível, mas estou pensando em qual seria uma boa decisão de design para multithreading. Atualmente, tenho a seguinte sequência de ações:

Inicialização (cria) ->Servidor (ouve clientes, cria) ->Cliente (ouve comandos e envia dados do período)

Estou assumindo uma média de 100 clientes, já que esse era o máximo a qualquer momento do jogo. Qual seria a decisão correta quanto à discussão da coisa toda? Minha configuração atual é a seguinte:

1 encadeamento no servidor que escuta novas conexões; em uma nova conexão, crie um objeto cliente e comece a escutar novamente.O objeto cliente possui um encadeamento, escutando os comandos recebidos e enviando dados periódicos. Isso é feito usando um soquete sem bloqueio, para que simplesmente verifique se há dados disponíveis, lide com isso e envie as mensagens em fila de espera. O login é feito antes do início do ciclo de envio e recebimento.Um tópico (por enquanto) para o jogo em si, pois considero que ele é separado de toda a parte cliente-servidor, em termos de arquitetura.

Isso resultaria em um total de 102 threads. Estou até pensando em dar ao cliente 2 threads, um para envio e outro para recebimento. Se fizer isso, posso usar E / S de bloqueio no thread do receptor, o que significa que o thread ficará praticamente ocioso em uma situação média.

Minha principal preocupação é que, usando esses muitos threads, estarei consumindo recursos. Não estou preocupado com as condições da corrida ou com os impasses, pois é algo com o qual tenho que lidar de qualquer maneira.

Meu design é configurado de tal maneira que eupoderia use um único encadeamento para todas as comunicações do cliente, independentemente de ser 1 ou 100. Separei a lógica de comunicação do próprio objeto do cliente, para poder implementá-la sem precisar reescrever muito código.

A principal questão é: é errado usar mais de 200 threads em um aplicativo? Tem vantagens? Estou pensando em executar isso em uma máquina com vários núcleos. Seria necessário tirar vantagem de vários núcleos como esse?

Obrigado!

Fora de todos esses segmentos, a maioria deles será bloqueada normalmente. Não espero que as conexões excedam 5 por minuto. Os comandos do cliente são recebidos com pouca frequência, eu diria 20 por minuto, em média.

Seguindo as respostas que recebo aqui (a mudança de contexto foi o desempenho que eu estava pensando, mas eu não sabia disso até que você apontou, obrigado!) Acho que vou seguir a abordagem com um ouvinte, um receptor, um remetente e algumas coisas diversas ;-)

questionAnswers(5)

yourAnswerToTheQuestion