2009-07-21 4 views
7

Ich habe folgenden Artikel gefunden: Use GCC-provided atomic lock operations to replace pthread_mutex_lock functionsGCC Atomic Builtins anstelle von Pthread?

Es bezieht sich auf GCC Atomic Builtins.

Was der Artikel vorschlagen, ist GCC atomare Builtins anstelle pthread Synchronisierungstools zu verwenden.

Ist das eine gute Idee?

PS. Der mysql Post ist offensichtlich irreführend. Atomic Builtins kann nicht alle Pthread-Werkzeuge ersetzen. Zum Beispiel erfordert das Sperren, dass, wenn eine Sperre nicht erlangt werden kann, ein Thread warten muss. Mit anderen Worten, es fordert das Betriebssystem auf zu warten, so dass das Warten passiv ist. Einfaches GCC-Built-in kann das nicht.

Antwort

5

Ist das eine gute Idee?

Nicht, wenn Sie jemals beabsichtigen, den Code mit etwas anderem als gcc zu kompilieren. Sind Pthreads spezielle Probleme?

+0

Keine Probleme mit Pthreads, nur zu fragen, ob es lohnend wäre, zu diesen GCC-Builtins zu wechseln. Ich werde immer mit GCC kompilieren, keine Chance, dies zu ändern. –

+1

"Wenn es nicht kaputt ist, repariere es nicht" ist meine Devise. –

+0

Diese Builtins wurden von Intel definiert, wie die Seite erwähnt; Ich würde erwarten, dass sie auch an anderen Compilern arbeiten. – CesarB

1

Nein. Die GCC-Einbauten sind wahrscheinlich gut für die Leute, die Betriebssysteme schreiben, libc und vielleicht pthreads selbst, aber für Ihre durchschnittliche Anwendung gibt es keinen Grund, den pthreads-Ansatz nicht zu verwenden.

Und auch wenn Sie immer GCC verwenden, möchten Sie vielleicht eines Tages ein statisches Analysetool ausführen, das nicht alle Kunden-GCC-Erweiterungen verarbeiten kann.

2

Wenn Sie bereits Pthread verwenden und die PThread-Lock-Funktionen bereits tun, was Sie wollen, ist es am besten, die PThread-Lock-Funktionen zu verwenden.

Diese atomaren Builtins sind nur die Bausteine ​​für höhere Primitive; Das Schreiben dieser übergeordneten Grundelemente ist meist schwierig, und Fehler können zu Fehlern führen, die sehr lange dauern können (da sie normalerweise vom Timing abhängen). Wenn Sie bereits eine Bibliothek mit übergeordneten Primitiven haben, die das tun, was Sie wollen und schnell genug für Ihre Bedürfnisse sind (und nicht davon ausgehen, dass sie zu langsam sind, nur weil Sie einen Funktionsaufruf machen müssen), ist es am besten, das nicht neu zu erfinden Rad.

0

Atommodelle sind sinnvoll, wenn Sie die Leistung verbessern möchten. Mit Builtins können Sie Konflikte minimieren, die durch die Serialisierung von Mutexen verursacht werden. Wenn Sie Mutexe verwenden und eine kritische Sitzung erstellen, serialisieren Sie den Zugriff auf diesen Abschnitt Ihres Codes. Im Performance-Code möchten Sie möglicherweise versuchen, Konflikte durch die Verwendung threadspezifischer Daten und wenn dies nicht mit Atomics möglich ist, zu vermeiden. Der letzte Fall ist das Sperren und beim Sperren minimieren Sie die Zeit, während der das Schloss gehalten wird (mit Messaging und doppeltem Checking, obwohl einige behaupten, dass es nicht funktioniert - funktioniert für mich).