Frage

in meiner multithraded Anwendung, ich bin mit einer sleep () Funktion (die von der GLFW Bibliothek):

glfwSleep(..);

, und es führt offenbar meine Bewerbung Speicherzugriffsfehler, wie mein Call-Stack zeigt:

#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)

Die glfwSleep() ist in einem Thread verwendet. Ist das gefährlich? Warum ist mein Programm Speicherzugriffsfehler als Folge davon?

Edit:

Wenn der Parameter des glfwSleep() ist <0,02 (s) es nicht segfault!

Edit 2:

Von der offiziellen Dokumentation von GLFW:

  

Schreiben Threaded-Anwendungen können   sehr umständlich, bevor Sie zu gewöhnen   es, aber es gibt ein paar wichtige Regeln, dass   zu folgen, sind ziemlich einfach:

     
      
  • IMMER gewährleisten exklusiven Zugriff auf Daten, die zwischen Threads gemeinsam genutzt wird!
  •   
  • Stellen Sie sicher, dass Threads synchronisiert richtig!
  •   
  • NIE busy wait!
  •   

Ich glaube, ich habe meine answer..have eine Alternative jetzt zu finden ..

Danke!

War es hilfreich?

Lösung

der GLFW Wiki :

  

GLFW funktioniert nicht gut mit GHC   Fäden, forkIO oder threadDelay. Damit   vermeiden sie, wenn Sie können.

Andere Tipps

Ist segfault'ed Thread selber Thread des Anrufers des glfwSleep ()?

Es scheint, dass der Absturz durch den Aufruf von WaitForMultipleObjectsEx API verursacht. macht Sie spezifiziert und auf die richtigen Synchronisations Objekte und Zahlen passieren zu WaitForMultipleObjectsEx?

Der Pragmatische Programmierer ,

  

`` Select‘‘ ist nicht gebrochen

     

Es ist selten zu   Einen Fehler in dem O oder die Compiler finden,   oder sogar ein Produkt von Drittanbietern oder   Bibliothek. Der Fehler ist höchstwahrscheinlich in der   Anwendung.

Warum ist Ihr Programm ruft WaitForSingleObjectEx() wenn glfwSleep() Sleep() ruft? Nun, auch wenn Sie den Quellcode nicht haben Sleep(), es ist nicht ganz eine Blackbox. Disassemblieren Sleep() und Sie werden wahrscheinlich sehen (je nachdem, welche Version von Windows Sie haben), die Sleep() entweder Anrufe oder Schwanz-Anrufe SleepEx(). Auf XP, SleepEx() ruft NtDelayExecutionThread() und auf Vista nennt es WaitForSingleObjectEx().

So was geschah mit dem Rest Ihres Stacks? 00000016, 0000006C und 00000000 sind keine gültigen Absenderadressen. Ich wäre nicht überrascht, wenn irgendwo in Ihrem Code Sie einen Zeiger auf einen Stapel zugewiesenen Puffer zu einem anderen Thread übergeben, und während Ihr Programm schläft, dass anderer Thread verdirbt die ersten Thread-Stack. Treten Sie ein in Sleep(), setzen Sie einen Speicherhaltepunkt auf der Absenderadresse, und Sie können in der Lage, die Schuldigen zu fangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top