Question

Objet

J'écris une petite bibliothèque pour laquelle la portabilité est la principale préoccupation. Il a été conçu pour ne prendre en charge que l’environnement C90 (ISO / IEC 9899: 1990), pour l’essentiel conforme… rien de plus. L'ensemble des fonctions fournies par la bibliothèque opère toutes (lecture / écriture) sur une structure de données interne. J'ai envisagé d'autres solutions de conception, mais rien ne semble possible pour ce que la bibliothèque est tentative de réalisation .

Question

Existe-t-il des algorithmes, techniques ou incantations portables pouvant être utilisés pour garantir la sécurité des threads? Je ne suis pas intéressé à rendre les fonctions ré-entrantes. De plus, je ne suis pas préoccupé par la vitesse ou le gaspillage (éventuel) de ressources si l’algorithme / technique / incantation est portable. Idéalement, je ne veux pas dépendre de bibliothèques (telles que GNU Pth) ou d’opérations spécifiques au système (telles que les tests atomiques).

J'ai envisagé de modifier Algorithme de boulangerie de Lamport , mais je ne sais pas comment modifiez-le pour qu'il fonctionne dans les fonctions appelées par les threads au lieu de fonctionner dans les threads eux-mêmes.

Toute aide est grandement appréciée.

Était-ce utile?

La solution

L’algorithme de boulangerie de Lamport fonctionnerait probablement; malheureusement, il reste encore des problèmes pratiques. En particulier, de nombreux processeurs implémentent les opérations de mémoire hors service : même si vous Après avoir compilé votre code en une séquence d’instructions parfaitement correcte, la CPU peut, lorsqu’elle l'exécute, décider de réorganiser les instructions à la volée pour obtenir de meilleures performances. La seule façon de contourner ce problème consiste à utiliser les barrières de mémoire , qui sont hautement centrées sur le système et le processeur. -spécifique.

Vous n'avez en réalité que deux choix: soit (1) garder la bibliothèque insensible aux threads et en informer les utilisateurs dans la documentation, ou (2) utiliser un mutex spécifique à la plate-forme. L’option 2 peut être facilitée en utilisant une autre bibliothèque qui implémente les mutex pour une grande variété de plates-formes et vous fournit une interface abstraite unifiée.

Autres conseils

Sans support système / matériel, au moins un CAS atomique, vous ne pouvez rien faire qui soit pratique. Il existe des bibliothèques portables qui regroupent diverses plates-formes en une interface commune.

http://www.gnu.org/software/pth/related.html

Presque tous les systèmes (même Windows) peuvent exécuter libpthread de nos jours.

Les fonctions ne peuvent pas être thread-safe ou sont intrinsèquement thread-thread, selon votre apparence. Et le filetage / verrouillage est intrinsèquement spécifique à la plate-forme. Vraiment, ce sont les utilisateurs de votre bibliothèque qui gèrent les problèmes de threading.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top