O multitarefa é simples. Codificar um aplicativo para multi-threading é muito, muito fácil.
Há um truque simples, e isso é usar uma fila de mensagens bem projetada (fazer não rolar o seu próprio) para passar dados entre os threads.
A parte difícil é tentar que vários threads atualizem magicamente um objeto compartilhado de alguma forma. É quando se torna propenso a erros porque as pessoas não prestam atenção às condições de corrida que estão presentes.
Muitas pessoas não usam filas de mensagens e tentam atualizar objetos compartilhados e criar problemas para eles mesmos.
O que se torna difícil é projetar um algoritmo que funcione bem ao passar dados entre várias filas. Isso é difícil. Mas a mecânica de threads coexistentes (via filas compartilhadas) é fácil.
Além disso, observe que os tópicos compartilham recursos de E / S. É improvável que um programa vinculado a E / S (isto é, conexões de rede, operações de arquivo ou operações de banco de dados) seja mais rápido com muitos threads.
Se você quiser ilustrar o problema de atualização de objetos compartilhados, isso é simples. Sente-se na mesa com um monte de cartões de papel. Anote um conjunto simples de cálculos - 4 ou 6 fórmulas simples - com muito espaço na página.
Aqui está o jogo. Cada um de vocês lê uma fórmula, escreve uma resposta e coloca um cartão com a resposta.
Cada um de vocês fará metade do trabalho, certo? Você está pronto na metade do tempo, certo?
Se o seu chefe não pensar muito e só começar, você acabará conflitando de alguma forma e ambos escrevendo respostas para a mesma fórmula. Isso não funcionou porque existe uma condição de corrida inerente entre vocês dois antes de escrever. Nada impede que você leia a mesma fórmula e substitua as respostas uma da outra.
Existem muitas maneiras de criar condições de corrida com recursos mal ou não bloqueados.
Se você quiser evitar todos os conflitos, corte o papel em uma pilha de fórmulas. Você tira um da fila, escreve a resposta e publica as respostas. Não há conflitos porque você lê a partir de uma fila de mensagens somente de um leitor.