Wenn zwei Threads beide dieselbe Datei mit fopen()
öffnen , haben sie jeweils unabhängige Dateistreams (FILE *
) unterstützt durch unabhängige Dateideskriptoren, die auf dieselbe Datei verweisen. Sie können unabhängig voneinander in die beiden Dateistreams schreiben, aber das Nettoergebnis in der Datei hängt davon ab, wohin die Threads schreiben und wann sie den Dateistream leeren. Die Ergebnisse sind unvorhersehbar, es sei denn, Sie steuern, wo jeder Thread schreibt. Am einfachsten ist es, sicherzustellen, dass beide Threads denselben Dateistream verwenden, aber Sie müssen sich wahrscheinlich noch zwischen den Threads koordinieren. Beachten Sie, dass POSIX die C-Funktionen benötigt, um einen koordinierten Zugriff auf den Dateistrom zu ermöglichen – siehe flockfile()
was die Anforderung auferlegt, dass
Alle Funktionen, die auf (FILE *)
verweisen Objekte, außer denen, deren Namen auf _unlocked
enden , sollen sich verhalten, als ob sie flockfile()
verwenden würden und funlockfile()
intern, um das Eigentum an diesen (FILE *) Objekten zu erlangen.
Wenn Sie die Datei in beiden Threads im Anhängemodus öffnen, werden die Schreibvorgänge jedes Mal sicher am Ende der Datei erfolgen, aber Sie müssen sich immer noch darum kümmern, die Daten zu leeren, bevor sich der Puffer füllt.
Wenn Sie die Datei übrigens im Append-Modus öffnen (O_APPEND
mit open()
, mit "a"
mit fopen()
), dann sollten sich alle Schreibvorgänge am Ende der Datei befinden, und Sie sollten keine Probleme mit verschachtelten Schreibvorgängen bekommen – es sei denn, vielleicht verwenden Ihre unabhängigen Threads Dateistreams und schreiben mehr als einen Puffer auf einmal, oder sie verwenden fflush()
nach dem Schreiben von Teilen jeder Ausgabezeile, oder sie verwenden write()
oder einer seiner unzähligen Verwandten, jedes Mal Teile einer Zeile zu schreiben. Es gibt Möglichkeiten, auf Probleme zu stoßen, sogar mit dem Anfügemodus, aber normalerweise müssen Sie versuchen, auf sie zu stoßen.
fopen()
ist wiedereingebbar , und Sie können so viele Deskriptoren haben, die auf dieselbe Datei zeigen, wie Sie möchten.
Was Sie als Ergebnis des Lesens/Schreibens von/in die Datei mit mehreren Deskriptoren erhalten, ist keine Thread-Sicherheitsfrage, sondern ein gleichzeitiger Dateizugriff, der in den meisten Fällen (außer wenn die Datei schreibgeschützt ist) nicht funktioniert gut.