Gleichzeitige Aufrufe von std :: call_once

8

Könnte mir bitte jemand erklären, warum beide Threads in diesem Programm (wenn sie mit den mit Visual Studio 2012/2013 gelieferten Compilern kompiliert wurden) blockiert sind, bis beide Aufrufe von std::call_once ausgeführt wurden? Ein weiterer Visual Studio-Fehler (vorausgesetzt, er verhält sich wie erwartet, wenn er mit GCC kompiliert wird)? Kann mir jemand einen Workaround einfallen lassen? Stell dir all den Schmerz vor, den ich durchgemacht habe, um das Problem zu verringern und bitte, sei barmherzig.

%Vor%

Um es auszuarbeiten, verhält es sich wie erwartet, wenn es mit GCC kompiliert wird:

  • druckt "3",
  • wartet 3 Sekunden,
  • druckt "1",
  • gibt sofort "2",
  • aus
  • wartet weitere 6-7 Sekunden,
  • und druckt "4".

Bei der Kompilierung mit den Compilern, die mit Visual Studio 2012/2013 ausgeliefert wurden, verhält es sich wie folgt:

  • druckt "3",
  • wartet 3 Sekunden,
  • druckt "1",
  • wartet weitere 6-7 Sekunden ,
  • und nur dann sofort "2" und "4" .

Es ist eindeutig ein Fehlverhalten. Oder nicht?

UPDATE: Ich kann dies nicht als Visual Studio-Fehler einreichen, da mein Arbeitskonto aus irgendeinem Grund "nicht dazu berechtigt ist, Feedback für diese Verbindung zu senden", was auch immer das bedeutet. Ich habe eine Antwort vom Microsoft STL-Betreuer erhalten, der sagt, dass er das Problem hoffentlich irgendwann in der Zukunft untersuchen wird.

    
Egor Tensin 21.10.2014, 00:22
quelle

2 Antworten

2

Ich habe eine Antwort vom STL-Betreuer bei Microsoft erhalten, die sagt, dass der Fehler in Visual Studio 2015 behoben wurde.

    
Egor Tensin 29.04.2015, 23:22
quelle
0

Es zieht vor, ein Fehlverhalten zu sein.
"Der Abschluss eines effektiven Aufrufs von call_once auf einem once_flag-Objekt wird mit allen nachfolgenden Aufrufen von call_once auf demselben once_flag -Objekt synchronisiert." (N3242, 30.4.4.2-Klausel-3).

    
Peixu Zhu 21.10.2014 01:06
quelle

Tags und Links