Ich habe diesen Code für compareAndSwap
in einer StackOverflow-Antwort gefunden:
Ist dies der geeignetste Weg, um einen portablen schnellen Code zu haben (außer Assembly Inlining).
Ein Problem besteht auch darin, dass diese spezifischen builtin
-Methoden unterschiedliche Parameter haben und Werte von einem Compiler zum anderen zurückgeben, was einige zusätzliche Änderungen wie die if then else
in diesem Beispiel erfordern kann.
Ein weiteres Problem wäre das Verhalten dieser builtin
-Methoden in der Maschinencode-Ebene, verhalten sie sich genau gleich? (z. B. die gleichen Montageanweisungen verwenden)
Hinweis: Ein weiteres Problem wäre, wenn es viele unterstützte Plattformen gibt, nicht nur ( Windows
und Linux
) wie in diesem Beispiel. Der Code könnte sehr groß werden.
Ich würde eine Hardware Abstraction Layer (HAL) verwenden, die generischen Code erlaubt - und jede portable Quelle kann für jede Plattform enthalten und erstellt werden.
Meiner Meinung nach ermöglicht dies eine besser strukturierte und besser lesbare Quelle.
Damit Sie diesen Prozess besser verstehen, würde ich Google empfehlen, Beispiele und Erklärungen zu finden.
Hoffentlich hilft diese kurze Antwort.
[EDIT] Ich werde ein einfaches Beispiel für Bionix versuchen, um zu zeigen, wie man ein HAL-System implementiert ...
mrAMainApplication.c enthält Folgendes ...
%Vor%Er erstellt dann eine Header-Datei (Remember - das ist ein Beispiel, nicht funktionierender Code!) ... Er erstellt hal.h ...
%Vor%Nun braucht Herr A zwei getrennte Quelldateien, eine für sein "Tianhe-2" -System und eine weitere für seinen Amiga 500 ...
hal_A500.c
%Vor%hal_Tianhe2_VERYFAST.c
%Vor%Herr A dann - beim Bauen für den Amiga - baut mrAmainApplication.c und hal_A500.c Beim Bauen für den Tianhe-2 benutzt er hal_Tianhe2_VERYFAST.c anstelle von hal_A500.c
Richtig - ich habe dieses Beispiel mit etwas Humor geschrieben, das ist nicht bei irgendjemandem mit einem Ohr markiert, nur ich fühle, dass es das Beispiel interessanter macht und hoffentlich zum Verständnis beiträgt.
Neil
Verwenden Sie in modernem C beginnend mit C11 _Atomic
für die Typqualifizierung und atomic_compare_exchange_weak
für die Funktion.
Die neueren Versionen von gcc und clang sind mit C11 kompatibel und implementieren diese Operationen auf portable Weise.
Schauen Sie sich ConcurrencyKit an und möglicherweise können Sie auch primitive Elemente auf höherer Ebene verwenden, was die meisten Leute wahrscheinlich wirklich wollen. Im Gegensatz zu HAL, die etwas Betriebssystem-spezifisch ist, glaube ich, dass CK unter Windows und mit einer Anzahl von Nicht-GCC-Compilern funktioniert.
Aber wenn Sie nur daran interessiert sind, "compare-and-swap" oder atomare Aktionen portabel auf einer Vielzahl von C-Compilern zu implementieren, schauen Sie, wie dieser Code funktioniert. Es ist alles Open-Source.
Ich vermute, dass die Details unordentlich werden können, und sie sind nicht etwas, das im Allgemeinen für die allgemeine Öffentlichkeit eine einfache oder interessante Ausstellung machen wird.
Tags und Links c intrinsics