17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

En effet, si un thread modifie une ressource, il doit en protéger l’accès par d’autres<br />

threads jusqu’à la fin de son travail. Ces points de synchronisation ou sections critiques<br />

évitent des effets de bords non maîtrisés en garantissant l’intégrité des ressources.<br />

D’un point de vue développement, le travail consiste à rendre le code thread-safe,<br />

c’est-à-dire à protéger toutes les parcelles de code qui modifient des données pouvant<br />

être lues et utilisées par d’autres parcelles de code, en utilisant des lockers, véritables<br />

verrous programmatiques.<br />

La séquence protégée est donc :<br />

1 lock : enclenchement du verrou ;<br />

2 travail : code protégé ;<br />

3 unlock : libération du verrou.<br />

Lorsqu’un thread A atteint l’étape 1, il verrouille les ressources auxquelles il va<br />

accéder et s’assure ainsi que l’étape 2 ne peut pas être exécutée par un autre thread en<br />

même temps.<br />

À la fin du travail, le thread A déverrouille les ressources. Si un deuxième thread B<br />

atteint l’étape 1 pendant que le thread A est encore dans l’étape 2, il est bloqué et doit<br />

attendre que le verrou soit libéré avant de pouvoir à son tour verrouiller les ressources.<br />

Cette technique paraît relativement simple de prime abord mais entraîne des difficultés<br />

de programmation :<br />

Si le thread A (ou tout autre thread si cette étape est déléguée) ne passe jamais par<br />

l’étape 3, par une exception mal gérée par exemple, le thread B reste bloqué à tout<br />

jamais. On parle dans ce cas d’un deadlock.<br />

Si le thread A, dans le code protégé, verrouille à nouveau les ressources, il se bloque<br />

lui-même par deux appels successifs à lock.<br />

Le deuxième cas peut être géré grâce à des verrous particuliers : les locks réentrants,<br />

qui ne bloquent pas un thread qui tente de verrouiller à nouveau les mêmes ressources.<br />

Le déverrouillage doit cependant être fait par ce même thread.<br />

Le premier problème reste entier et nécessite de bien contrôler le code protégé.<br />

En termes de performances, il est aussi important de ne protéger que le strict nécessaire<br />

pour éviter des latences dues à des verrous sur des portions de code trop larges.<br />

Une dernière technique de coordination consiste à faire communiquer les threads<br />

entre eux pour qu’ils puissent travailler de manière concertée.<br />

Typiquement, un thread attend qu’un signal soit émis pour commencer ou continuer<br />

son travail, ce signal étant émit par un autre thread.<br />

453

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!