Bavíme se doufám o tom stejném, přístupu k souboru z jedné aplikace (ale třeba ve více vláknech), a zanedbání vnějšího vlivu?
V takovém případě k čemu to UT je, když nedělá ani takovou typickou věc?
Ty vnější vlivy se vlastně zanedbat ani nedají. Ale zkusím to vyjasnit

Když otevíráš soubor, tak zavoláš nějakou funkci která přes FFI zavolá něco co ten soubor otevře. Dostaneš zpět zabalený descriptor nebo handle. Ten zabalený descriptor ti už UT ohlídá tak, že se nedá jen tak zkopírovat a předat třeba různým vláknům.
Ale představ si, že máš funkci která dostane jeden unikátní soubor a vrací dva. Ta funkce je implementovaná zase přes FFI, protože uvnitř volá systém. Díky tomu překladač nemá šanci poznat, co se uvnitř děje. Může se tam zkopírovat deskriptor, nebo jen otevřít pomocný soubor atd. Stejně tak pro čtení, zápisy a i všechno ostatní musí funkce uvnitř ten descriptor vybalit a předat systému. A překladač může jen "doufat", že s tím vybaleným descriptorem děláš něco příčetného. Stejně tak ti typový systém neohlídá, že znova neotevřeš stejný soubor.
Takže ano, UT chrání před zkopírováním handle na soubor a předání do více vláken. Chrání ale jenom ocaď pocaď, protože se to dá poměrně jednoduše obejít. Ony i ty čisté funkce bez vedlejších efektů mívají občas vnitřnosti ve špinavém C. Jediná věc, která z nich dělá čisté je keyword, kterým programátor přísahá že nedělá žádné blbosti.