Frage

Zweck

Ich schreibe eine kleine Bibliothek, für die Portabilität die größte Sorge ist. Umwelt ... nichts mehr: Es wurde nur die am meisten entsprechend C90 (1990 ISO / IEC 9899) zu übernehmen konzipiert. Der Satz von Funktionen, die von der Bibliothek bereitgestellt arbeiten alle (Lesen / Schreiben) auf einer internen Datenstruktur. Ich habe einige andere Design-Alternativen in Betracht gezogen, aber nichts anderes scheint denkbar, was die Bibliothek versucht zu erreichen.

Frage

Gibt es tragbare Algorithmen, Techniken oder Beschwörungen, die verwendet werden können, Thread-Sicherheit zu gewährleisten? Ich bin nicht besorgt über die Funktionen einspringenden machen. Außerdem bin ich nicht Geschwindigkeit oder (möglicherweise) Verschwendung von Ressourcen betroffen, wenn der Algorithmus / Technik / Beschwörung tragbar ist. Im Idealfall, ich will nicht auf irgendwelchen Bibliotheken (wie GNU Pth) oder systemspezifische Operationen (wie Atomtest-and-set) abhängig zu sein.

Ich habe Modifizieren betrachtet Lamports Bäckerei Algorithmus , aber ich weiß nicht, wie man ändert sie innerhalb der Funktionen durch die Fäden, anstatt zu arbeiten in den Fäden selbst genannt zu arbeiten.

Jede Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

Lamports Bäckerei Algorithmus würde wahrscheinlich funktionieren; leider gibt es noch praktische Probleme mit sich. Insbesondere implementieren viele CPUs out-of-order-Speicheroperationen : auch wenn Sie habe Ihren Code in eine vollkommen korrekte Befehlsfolge zusammengestellt, die CPU, wenn der Code ausgeführt wird, können beschließen, die Anweisungen auf der Fliege neu zu ordnen eine bessere Leistung zu erzielen. Der einzige Weg, dies zu umgehen ist Speicherbarrieren , die hoch System- und CPU sind -spezifische.

Sie haben wirklich nur zwei Möglichkeiten: Entweder (1) halten Sie Ihre Bibliothek fade unsicher und Ihre Nutzer, dass in der Dokumentation aufmerksam machen, oder (2) verwenden, um eine plattformspezifische Mutex. Option 2 kann unter Verwendung einer anderen Bibliothek erleichtert werden, die mutexes für eine Vielzahl von Plattformen und bietet Ihnen eine einheitliche, abstrakte Schnittstelle implementiert.

Andere Tipps

Ohne O / Hardware-Unterstützung, zumindest eine Atom CAS, gibt es nichts, was man praktisch das ist, zu tun. Es sind portable Bibliotheken, die abstrakten verschiedene Plattformen in eine gemeinsame Schnittstelle, though.

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

Fast alle Systeme (auch Windows) kann in diesen Tagen laufen libpthread.

Funktionen können entweder nicht Thread-sicher oder sind angeboren Thread-sicher, je nachdem, wie man es suchen. Und Einfädeln / Verriegelung ist angeboren plattformspezifisch. Wirklich, es ist bis zu Benutzer Ihre Bibliothek, die die Thread-Probleme zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top