Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

1

03.11.2004, 17:00

threadsicheres logging-system

wie würdet ihr ein threadsicheres logging-system relisieren? für jeden thread eine eigene log oder sollte eine geimeinsame datei genutzt werden in der jeder thread "kennzeichnet" was von ihm ist? letzteres könnte ziemlich unübersichtlich werden. beides ist eigentlich nicht das wahre. wenn ich nur nen kleinen thread mit wenigen ausgaben habe, benötigt dieser ja auch keine komplette datei...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

03.11.2004, 17:34

Hmm also relativ threadsicher kann man ein Programm mit hilfe einer bool var machen. Oder Wenn du eine nahc Threads geordnete Log meinst, dann könntest du das mit offsets in der Datei machen.

3

03.11.2004, 19:53

Zitat von »"Nox"«

Hmm also relativ threadsicher kann man ein Programm mit hilfe einer bool var machen. Oder Wenn du eine nahc Threads geordnete Log meinst, dann könntest du das mit offsets in der Datei machen.
Nah...thats evil.

Mit bool's bekommt man nichts Thread sicher. Das schreiben in einer Datei ist eh Thread sicher. Vom OS schon her. Es erlaubt nämlich nicht das zwei Threads gleichzeitig in eine Datei schreiben. Problem der zweite Thread bekommt ne Fehlermeldung beim öffnen.

Pro Thread eine Log-Datei ist au unsinn. Es ist am besten wenn mehrere Caches anlegst. In die dann geschrieben wird. Zudem sollte jeder Thread eine UID erhalten. Die dann auch mit dem Log ausgegeben wird.

Für die Syncronisierung empfehle ich Critical Sections. Die sind von allen Syncronisationsobjekten die schnellsten und werden au von Linux unterstützt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

4

03.11.2004, 20:27

wie meinst du das mit den caches? als so ne art buffer? also dass jeder thread seinen eigenen buffer hat und wenn er diesen ausgegeben haben will ne nachricht an den "ausgabe thread" schickt, welcher ihn dann in die datei schreibt...
obwohl, dass klappt so auch nicht. wenn der ausgabe-thread gerade den buffer liest, darf dieser vom thread ja nicht verändert werden...
ich glaub man kommt nicht um wartezeiten, oder?

5

03.11.2004, 23:18

Ja ein Buffer. Die STL Arbeitet nur damit. Wenn man einen Buffer ausgeben will. Ruft man eine Flush-Methode auf. Die fester bestandteil der Log-Klasse ist.

Hin und wieder muss man warten. Das ist halt so. Aber mit den Buffern vermeidet man zum einen das Arbeiten mit Offsets und minmiert so das warten. Der Flush leert dann auf einen Schlag den Buffer.

Einen eigenen Log Thread zu starten ist unsinn und kostet mehr als er bringt. Jeder Thread sollte in der Lage sein ins Log zu schreiben.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

6

03.11.2004, 23:19

Meine Erfahrung ist, dass bei mehreren threads sehr viele oder gar die meisten fehler daher kommen, dass Sachen in einer "falschen" Reihenfolge passieren. Daher finde ich es sehr wichtig, alles chronologisch in einer Log zu haben. Ich habe das in BoB tatsächlich mit Critical Sections implementiert :).

PS: Da ich u.a. auch Zeitausgaben gemacht habe, habe ich auch einen Cache implementiert. Allerdings nur einen für beide Threads ;). Ausserdem muss der abschaltbar sein, damit man bei CTDs an die letzte Debugausgabe kommt.
"Games are algorithmic entertainment."

7

04.11.2004, 00:10

Da wir au mit mehreren Threads arbeiten, haben wir eben au diese Caches. Die Log-Klasse ist dabei nur sowas wie ein Wrapper und ein kleiner Cache. Der Logger ist dann eine eigene Klasse.

Das klappt sehr gut, da nur eine Critical Section beim schreiben notwendig ist. Da die Buffer immer Lokal sind und somit nicht Syncronisiert werden müssen.

Joa...Threads sind immer so ne Sache. bringen viele Performancevorteile. Aber die Fehlerquellen steigen überproportional an.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Sicaine

unregistriert

8

04.11.2004, 01:46

Hm ich hättes jetzt eher einfach in ne Logdatei geschrieben und ein kleines Debugtool was mir die Logdatei einfach aufsplittet etc.

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

9

04.11.2004, 12:21

du kannst ja eben nicht so ohne weiteres mehrere threads in dieselbe datei schreiben lassen...

10

04.11.2004, 13:40

Zitat von »"Sicaine"«

Hm ich hättes jetzt eher einfach in ne Logdatei geschrieben und ein kleines Debugtool was mir die Logdatei einfach aufsplittet etc.

Nehmen wir an du hast deine Log-Datei jetzt schön aufgeteilt und jeder Thread hat nun Platz in der Datei.

Thread A öffnet nun das Log File. Bevor er ins file schreiben kann, wird er unterbrochen. Thread B will nun ebenfalls etwas ins Log schreiben. Öffnet nun die Log Datei. Bekommt allerdings einen Fehler. Logging wird abgebrochen. Und nu? Thread B muss hier auf Thread A warten bis er das Log file wieder freigibt.

Man könnte natürlich das Log file einmal beim Start öffnen und erst wieder am ende Schließen. Hat aber zwei hacken.

1) Bei einem Programmabbruch ist nicht sichergestellt, das auch alles im Log landet. Im schlimmstenfall ist das File leer (Hatte ich schon oft).
2) Mehrere Threads können willkürhlich ins Log schreiben. Was passiert dann wenn der vorgesehene Raum für as Logging voll ist?

Du hast noch nicht viel mit Threads gearbeitet nehm ich an. Wenn du dann damit anfängst wirst du vieles sehr schnell feststellen. Auch wir musten da sehr viel Lernen, bevor alles richtig lief.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige