Modelos de Concorrência
Um modelo de concorrência é uma combinação de três coisas:
- Uma unidade de concorrência (representando tarefas)
- A forma como essas tarefas serão escalonadas
- As regras de como duas ou mais tarefas podem coordenar entre si
Uma linguagem de programação pode tranquilamente oferecer mais de um modelo para o programador, que poderá escolher um ou mais modelos para resolver algum problema.
Vamos ver dois modelos de concorrência para ilustrar essa definição. Essas descrições estão longe de serem detalhadas, pois o detalhamento virá nos capítulos dos respectivos modelos.
Threads e Locks
Esse modelo é composto de:
- Unidade de Concorrência: Threads do SO
- Escalonamento: Preemptivo e realizado no kernel-space.
- Coordenação: Memória compartilhada + Locks
As threads se comunicam através de memória compartilhada e, para controlar o acesso a essa memória, realizam sincronização por meio de locks (Mutex, por exemplo).
Concorrência Lock-Free
Esse modelo é composto de:
- Unidade de Concorrência: Threads do SO
- Escalonamento: Preemptivo e realizado no kernel-space.
- Coordenação: Memória compartilhada + Atomics
Nesse caso, é praticamente o mesmo modelo que o anterior. No entanto, ao invés de sincronizarem o acesso à memória por meio de locks, são utilizadas operações atômicas (também chamadas de atomics).
As próximas Partes do livro irão focar em cada modelo de concorrência relevante, aprendendo o jeito correto de raciocinar e programar em cada modelo, e vendo quando usar (ou não) cada um deles.