Pokud dvě vlákna otevřou stejný soubor s fopen()
, každý z nich bude mít nezávislé proudy souborů (FILE *
) podporované nezávislými deskriptory souborů odkazujícími na stejný soubor. Můžete zapisovat nezávisle do dvou souborových proudů, ale čistý výsledek na souboru bude záviset na tom, kam vlákna zapisují a kdy vyprázdní proud souboru. Výsledky jsou nepředvídatelné, pokud nekontrolujete, kam které vlákno zapisuje. Nejjednodušší věcí je zajistit, aby obě vlákna používala stejný datový proud, ale pravděpodobně budete stále potřebovat koordinaci mezi vlákny. Všimněte si, že POSIX vyžaduje funkce C, aby poskytly koordinovaný přístup k datovému proudu souborů – viz flockfile()
který ukládá požadavek, aby
Všechny funkce, které odkazují na
(FILE *)
objektů, kromě těch, jejichž názvy končí na_unlocked
, se budou chovat, jako by používaliflockfile()
afunlockfile()
interně získat vlastnictví těchto (FILE *) objektů.
Pokud soubor otevřete v režimu připojení v obou vláknech, zápisy by byly pokaždé bezpečně na konci souboru, ale stále se musíte starat o vyprázdnění dat, než se vyrovnávací paměť zaplní.
Mimochodem, pokud soubor otevřete v režimu připojení (O_APPEND
s open()
pomocí "a"
s fopen()
), pak by všechny zápisy měly být na konci souboru a neměli byste se dostat do problémů s prokládanými zápisy – pokud možná vaše nezávislá vlákna nepoužívají datové proudy souborů a nezapisují najednou více než vyrovnávací paměť nebo používají fflush()
po zapsání částí každého řádku výstupu, nebo používají write()
nebo jeden z jeho nesčetných příbuzných, aby pokaždé napsal části řádku. Existují způsoby, jak narazit na problémy i v režimu připojení, ale obvykle se s nimi musíte pokoušet.
fopen()
je opakovatelný a můžete mít tolik deskriptorů směřujících na stejný soubor, kolik chcete.
To, co získáte jako výsledek čtení/zápisu ze/do souboru pomocí více deskriptorů, není otázka bezpečnosti vlákna, ale spíše souběžný přístup k souboru, který ve většině případů (kromě případů, kdy je soubor pouze pro čtení) nebude fungovat. dobře.