none
VS11 Beta und Initialisierung statischer Daten immer noch nicht thread-safe RRS feed

  • Frage

  • Hi,

    ich habe mal gerade VS11 Beta installiert und folgendes kompilieren lassen:

    CMyObject &GetNyObject()
    {
      static CMyObject Result;
      return Result;
    }

    Ich bekomme immer noch
    warning C4640: 'Result' : construction of local static object is not thread-safe

    Im neuen C++11 steht doch, dass statische Objekte immer thread-safe
    initialisiert werden müssen.

    Offensichtlich implementiert VS11-Beta diesen (für mich wichtigen Teil) nicht.
    Gibt es eigentlich eine Featur-List (bzgl. des C++-Standards) was VS11Beta unterstützt
    und was evtl. es noch in die Release schafft?

    Tschüß, Holger.

    Mittwoch, 2. Mai 2012 10:07

Antworten

Alle Antworten

  • Die Liste ist hier:
    http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

    Du meinst vermutlich den Punkt "Magic statics", welcher mit "No" drin steht...


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 2. Mai 2012 11:08
  • Die Liste ist hier:
    http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

    Du meinst vermutlich den Punkt "Magic statics", welcher mit "No" drin steht...


    Jochen Kalmbach (MVP VC++)

    wirklich extrem schade... Dann muss ich ja wohl doch mittelfristig die Quelltexte durchgehen.

    Ich meine, wenn das Konstrukt
    CMyObject &GetMyObject(){static CMyObject Result; return Result;}
    für lazy evaluation eingesetzt wird, dann bekomme ich es ja durchaus thread-safe.

    Z.B. (inperformant)
    CCriticalSection cs;
    CMyObject &GetMyObject(){cs.Lock(); static CMyObject Result; cs.Unlock(); return Result;}

    Wenn ich das Konstrukt allerdings dafür einsetze, um eine Erzeugungsreihenfolge globaler
    Variablen sicherzustellen, dann wird i.d.R. die nötige CriticalSection nicht rechtzeitig
    initialisiert sein.

    Aber da ja scheinbar atomic und memory fences unterstützt werden, wird vielleicht
    irgendwann eine allgemeingültige Singleton-Implementierung zu finden sein.

    ps:

    Ich lese gerade "C++ programmieren 60 Techniken für guten C++11-Code" von Torsten T. Will
    Dort sind zwei Singleton-Implementierungen mit "atomic" drin.
    Und was sehe ich im Quelltext: ein lokales "static mutex m;" zur Absicherung - welches
    in VS11 ja nicht thread-safe ist - und damit sind die ganzen komplexen Algorithmen
    ein Singleton thread-safe zu erzeugen hinfällig.

    Tschüß, Holger.

    Mittwoch, 2. Mai 2012 12:15