Tenho tido a necessidade de lidar com muitas bibliotecas de terceiros e teno percebi um erro (ou seria uma abordagem?) comum nas mais novas: quase nenhuma delas é thread-safe.
Acredito que, com o modismo do uso de corrotinas (chamadas lightweight threads), os programadores mais novos passaram a considerar os threads de sistema obsoletos, deixando de tomar cuidados essenciais para boas bibliotecas.
Bem, tenho uma novidade para vocês: threads não são obsoletos e corrotinas não resolvem todos os problemas do mundo. Há situações em que usar corrotinas pode ser a melhor opção sim, mas em alguns casos os bons e velhos threads ainda são o salva vidas.
Para que isso seja possível, na criação de bibliotecas é necessário tomar alguns cuidados:
Acredito que, com o modismo do uso de corrotinas (chamadas lightweight threads), os programadores mais novos passaram a considerar os threads de sistema obsoletos, deixando de tomar cuidados essenciais para boas bibliotecas.
Bem, tenho uma novidade para vocês: threads não são obsoletos e corrotinas não resolvem todos os problemas do mundo. Há situações em que usar corrotinas pode ser a melhor opção sim, mas em alguns casos os bons e velhos threads ainda são o salva vidas.
Para que isso seja possível, na criação de bibliotecas é necessário tomar alguns cuidados:
- Prefira sempre que possível usar objetos imutáveis. Prefira tuplas, strings, tipos numéricos básicos, etc.
- Evite permitir que objetos agregados façam alteração em seu objeto contentor sempre que possível.
- Em todos métodos e propriedades de um objeto que pode ser compartilhado (como o contentor citado) que alterem o estado do objeto, inicie com um
RLock
, chamando seu métodoacquire
, e encerre chamando seu métodorelease
. Tome cuidado para que seja usada a mesma instância deRLock
! - Não tenha medo de usar objetos do módulo
threading
:Condition
,Event
,Lock
,RLock
eBoundedSemaphore
. Eles são seus amigos. ;-) - Se estiver difícil escrever testes, substitua
threading
pordummy_threading
para os testes unitários, mas usethreading
para testes de aceitação.
[]’s
Cacilhας, La Batalema