Uma boa concorrência requer muito mais do que lançar alguns threads em um aplicativo e esperar o melhor. Há uma variedade de como um programa simultâneo pode passar de embaraçosamente paralelo a puro seqüencial. Qualquer programa pode usar a lei de Amdahl para expressar quão escalável é um problema ou algoritmo. Algumas qualificações para uma aplicação embaraçosamente paralela seriam:
- Sem estado compartilhado, todas as funções dependem apenas dos parâmetros passados no
- Sem acesso a dispositivos físicos (placas gráficas, discos rígidos etc.)
Existem outras qualificações, mas com apenas essas duas podemos entender por que os jogos em particular não são tão fáceis quanto você imagina para tirar proveito de múltiplos núcleos. Por um lado, o modelo do mundo que será renderizado deve ser compartilhado, pois diferentes funções calculam física, movimento, aplicam inteligência artificial etc. Segundo, cada quadro deste modelo de jogo deve ser renderizado na tela com uma placa gráfica.
Para ser justo, muitos criadores de jogos usam mecanismos de jogos produzidos por terceiros. Demorou um pouco, mas esses mecanismos de jogos de terceiros agora são muito mais paralelos do que costumavam ser.
Existem desafios arquitetônicos maiores ao lidar com simultaneidade eficaz
A simultaneidade pode assumir várias formas, desde a execução de tarefas em segundo plano até um suporte arquitetural completo para simultaneidade. Alguns idiomas oferecem recursos de simultaneidade muito poderosos, como o ERLANG , mas exige que você pense de maneira muito diferente sobre como você constrói seu aplicativo.
Nem todo programa realmente precisa da complexidade do suporte multicore completo. Um exemplo é o software tributário ou qualquer aplicativo orientado a formulários. Quando a maior parte do tempo é gasta esperando o usuário fazer alguma coisa, a complexidade dos aplicativos multithread não é tão útil.
Alguns aplicativos se prestam a uma solução paralela mais embaraçosa, como aplicativos da web. Nesse caso, a plataforma começa embaraçosamente paralela e você não precisa impor a contenção de threads.
A linha inferior:
Nem todos os aplicativos são realmente prejudicados por não aproveitarem vários threads (e, portanto, núcleos). Para aqueles que são prejudicados por isso, às vezes os cálculos não são amigáveis ao processamento paralelo ou a sobrecarga para coordenar isso tornaria o aplicativo mais frágil. Infelizmente, o processamento paralelo ainda não é tão fácil quanto deveria ser.