Ist std::string thead-safe mit gcc 4.3?

Entwickle ich ein Multithread-Programm läuft auf Linux (kompiliert mit G++ 4.3) und wenn Sie suchen, um für ein bisschen Sie finden viele schreckliche Geschichten über std::string nicht thread-safe ist mit GCC. Dies ist vermutlich auf die Tatsache zurückzuführen, dass es intern verwendet copy-on-write, die verheerende Auswirkungen mit tools wie Helgrind.

Ich habe ein kleines Programm, das kopiert eine Zeichenfolge in eine andere Zeichenfolge und wenn Sie inspizieren die beiden Zeichenfolgen, die Sie beide teilen die gleichen internen _M_p Zeiger. Wenn ein string geändert wird, ändert sich der Zeiger, so dass das copy-on-write-stuff ist in Ordnung.

Was ich bin besorgt obwohl was passiert, wenn ich Teile einer Zeichenfolge zwischen zwei threads (zum Beispiel indem er als ein Objekt in einer threadsicher dataqueue zwischen zwei threads). Ich habe bereits versucht zu kompilieren, mit der '-pthread' option, aber das scheint nicht viel Unterschied. Also meine Frage:

  • Gibt es eine Möglichkeit zu zwingen, std::string threadsicher? Ich würde nicht dagegen, wenn die copy-on-write-Verhalten deaktiviert wurde, dies zu erreichen.
  • Wie haben andere Leute das Problem gelöst? Oder bin ich paranoid?

Ich kann nicht scheinen zu finden, eine definitive Antwort, so dass ich hoffe, Euch kann mir helfen..

Edit:

Wow, das ist eine ganze Menge von Antworten in so kurzer Zeit. Danke!!! Ich werde auf jeden Fall nutzen Jack ' s Lösung, wenn ich Sie deaktivieren möchten, KUH. Aber jetzt die wichtigste Frage: muss ich wirklich deaktivieren KUH? Oder ist die 'Buchführung' erfolgt für KUH-thread-safe? Ich bin momentan im libstdc++ - Quellen, aber das wird einige Zeit dauern, um herauszufinden,...

Edit 2

OK durchsuchten die libstdc++ - source-code und ich finde so etwas in libstd++-v3/include/bits/basic_string.h:

  _CharT*
   _M_refcopy() throw()
   {
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
     if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
            __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
     return _M_refdata();
   }  //XXX MT

Also es ist definitiv etwas, das es zu atomaren änderungen an der Referenz-Zähler...

Abschluss

Ich bin-Kennzeichnung sellibitze Kommentar als Antwort hier, weil ich denke, wir haben zu der Schlussfolgerung gelangt, dass dieser Bereich ist immer noch ungelöst, jetzt. Zur Umgehung der KUH Verhalten würde ich vorschlagen, Jack Lloyd ' s Antwort. Ich danke Ihnen allen für eine interessante Diskussion!

  • +1 gute Frage! Leider, die Menschen nur Lesen "threadsicher" und denke "Nein!". Sie besser Lesen Sie die gesamte Frage! 🙂
  • Da std::string ist eine Instanz der template std::basic_string es könnte möglich sein, für Sie zu werfen Sie einen Blick auf den source-code. Versuchen Sie, für jedes makro, das würde wiederum on/off thread-Sicherheit.
  • Übrigens, copy-on-write ist langsam in multi-threaded-Umgebungen, Sie sollten nicht benutzen willst, nicht bereit.
  • Siehe auch stackoverflow.com/questions/1661154/...
InformationsquelleAutor Benjamin | 2009-10-20
Schreibe einen Kommentar