S
@lynarstudios sagte in std::lock_guard (mutex) produziert deadlock:
Ja. Wenn ich alle lock guards entfernen würde, würde es funktionieren. Ich habe die ganze Anwendung aber um einen Memory Organizer erweitert. Der soll Inhalte selbst laden / entladen, wenn ein bestimmter Spielabschnitt erreicht wurde. Dieser Memory Organizer wird in einem neuen Thread gestartet, wenn er merkt, dass er neue Sachen laden soll. Das funktioniert auch. Aber das ist der Grund warum die ganze Engine thread safe sein muss. Weil nebenbei soll das Spiel ja auch weiter laufen können.
Ziemlich viel im Konjunktiv. Aber ok. Kann es sein, dass ein Thread deine Engine schon wieder zerstört während andere noch nicht fertig mit ihrer Arbeit sind?
Die Frage wäre dann was und warum. Ich initialisiere ja die engine am Anfang und dort scheint auch alles zu funktionieren. Der Mutex ist ja wie gesagt ein Attribut in der Engine Klasse. Er müsste eigentlich die ganze Zeit verfügbar sein?
Das würde passen, wenn man nicht sicher stellt, dass alle Arbeit fertig ist, bevor man anfängt aufzuräumen.
P.S: Gibt es einen Grund dafür, dass du konstant C-Strings verwendest, anstelle von std::string?
Nicht wirklich. Ich kenne die Klasse, habe sie aber einfach nur noch nie genutzt.
Das ist einer der Punkte, den ich weiter oben mit "modernen C++" Strukturen meine. Du verwendest recht viel "new" und "delete". Entsprechende Stichwort wäre "Resource acquisition is initialization" (RAII). Vor allem verwendung von Smart Pointern und anderen Klassen die das entsprechend kapseln. (Z.B. der lock_quard ist ein Beispiel für das Idiom.)