Intuition générale : entrer dans une section critique de manière telle qu'une même donnée soit accédée par au moins deux unités d'exécution, dont au moins une en écriture, et ce sans synchronisation est une chose périlleuse, une Data Race, qui mène directement au comportement indéfini.
Le code qui suit est une implémentation où les accès en zone critique se font sans aucune synchronisation. Les résultats, dû à des conditions de course, sont indéfinis.
Je vous propose ceci à titre comparatif seulement. N'utilisez pas cet « algorithme » en pratique.
L'article suppose que vous avez lu la présentation générale des algorithmes de synchronisation classiques, de même que Algos-Section-Critique-General.html qui explique la démarche d'ensemble, présente les risques et décrit les classes Producteur et Consommateur qui sont réinvesties ici.
Par souci de « symétrie » ou par mimétisme partiel, j'ai utilisé un type nommé etat_synchro dans cette version, mais il ne sert, comme vous pouvez le voir, à presque rien – aucune synchronisation ne sera faite, après tout. |
|
L'algorithme, si on peut le nommer ainsi, est à droite. On remarquera que l'accès à la section critique se fait sans aucune protection. On le comprendra, cette pratique n'est pas des plus recommandables (c'est le moins qu'on puisse dire). Ce code n'a de sens que dans un contexte monoprogrammé, là où un seul thread opère à la fois... Ici, c'est un désastre pur et simple. |
|
Sans grande surprise, le programme principal lance les diverses unités de traitement souhaitées, assure leur identification correcte et leur supplée le booléen qu'elles partageront et qui jouera pour elles le rôle d'un signal de fin, puis attend la fin des threads et nettoie les ressources attribuées au préalable. |
|
À vos risques et périls, cependant.