2009-04-28 4 views
12

Bald werde ich anfangen, an einer parallelen Version eines Mesh-Verfeinerungsalgorithmus mit Shared Memory zu arbeiten.C++ neuer Operator Thread-Sicherheit in Linux und GCC 4

Ein Professor an der Universität wies darauf hin, dass wir sehr auf Thread-Sicherheit achten müssen, da weder der Compiler noch die STL Thread-bewusst ist.

Ich suchte nach dieser Frage und die Antwort hing vom Compiler ab (einige versuchen, etwas thread-aware zu sein) und die Plattform (wenn die vom Compiler verwendeten Systemaufrufe threadsicher sind oder nicht).

Also, in Linux, der GCC 4 Compiler produziert thread-sicheren Code für den neuen Betreiber?

Wenn nicht, was ist der beste Weg, um dieses Problem zu überwinden? Vielleicht jeden Anruf an den neuen Operator sperren?

Antwort

16

Sie müssen sehr intensiv nach einer Plattform suchen, die Threads unterstützt, aber keinen threadsicheren new. Tatsächlich ist die Gewindesicherheit von new (und malloc) einer der Gründe, warum es so langsam ist.

Wenn Sie eine threadsichere STL auf der anderen Seite wünschen, können Sie Intel TBB in Betracht ziehen, die Thread-fähige Container hat (obwohl nicht alle Operationen auf ihnen Thread-sicher sind).

8

Generell ist der Operator Thread-sicher - jedoch Threadsicherheit garantiert für Anrufe in die STL und die Standard-Bibliothek werden durch den Standard geregelt - das bedeutet nicht, dass sie Threads nicht bewusst sind - sie neigen dazu, sehr gut definierte Garantien haben der Fadensicherheit für bestimmte Operationen. Beispielsweise ist das wiederholte Durchlaufen einer Liste schreibgeschützt für mehrere Leser Thread-sicher, während das Durchlaufen einer Liste und das Durchführen von Aktualisierungen dies nicht ist. Sie müssen die Dokumentation lesen und sehen, was die verschiedenen Garantien sind, obwohl sie nicht so belastend sind und sie sinnvoll sind.

+0

Und in welchen Fällen ist der neue Operator nicht Thread-sicher? Sollte ich mir darüber Gedanken machen oder es einfach benutzen? – Gaston

+1

Das hängt von Ihrem Compiler-Provider oder Ihrer Implementierung ab - zum Beispiel können Sie in Visual C++ zwischen einer Multithread-Standardbibliothek oder einer Single-Threaded-Bibliothek wählen, obwohl das heutzutage keine große Wahl ist die Multithread-Bibliothek. –

2

Während ich über Konzepte sprechen, die ich nicht verwendet habe, sollte ich erwähnen, dass wenn Sie Shared Memory verwenden, Sie wahrscheinlich sicherstellen möchten, dass Sie nur POD-Typen verwenden und Placement neu verwenden. Zweitens, wenn Sie shared memory verwenden, wie es auf Linux-Systemen üblich ist, dann verwenden Sie möglicherweise mehrere Prozesse - nicht Threads, um Speicher zuzuordnen und tun Sie Dinge - Shared Memory als eine Kommunikation verwenden Schicht. Wenn dies der Fall ist, dann ist die Thread-Sicherheit Ihrer Anwendung und Bibliotheken nicht wichtig - was jedoch wichtig ist, ist die Thread-Sicherheit von allem, was die gemeinsame Speicherzuweisung verwendet! Dies ist eine andere Situation als das Ausführen eines Prozesses mit vielen Threads. In diesem Fall ist die Frage nach der Threadsicherheit des neuen Operators ein gültiges Problem und könnte durch ein neues Placement behoben werden, wenn dies nicht der Fall ist, oder indem eigene Zuweiser definiert werden.

1

Nun, das ist keine endgültige Antwort auf meine Frage, nur dass ich herausgefunden habe, dass Google eine Hochleistungs-Multi-Thread-malloc implementiert.

Also, wenn Sie Zweifel haben, ob Ihre Implementierung Thread sicher ist, sollten Sie vielleicht die Google Performance Tools verwenden.