+\itindbeg{thread}
+
+Gli \textit{stream} possono essere usati in applicazioni \textit{multi-thread}
+allo stesso modo in cui sono usati nelle applicazioni normali, ma si deve
+essere consapevoli delle possibili complicazioni anche quando non si usano i
+\textit{thread}, dato che l'implementazione delle librerie è influenzata
+pesantemente dalle richieste necessarie per garantirne l'uso con i
+\textit{thread}.
+
+Lo standard POSIX richiede che le operazioni sui file siano atomiche rispetto
+ai \textit{thread}, per questo le operazioni sui buffer effettuate dalle
+funzioni di libreria durante la lettura e la scrittura di uno \textit{stream}
+devono essere opportunamente protette (in quanto il sistema assicura
+l'atomicità solo per le system call). Questo viene fatto associando ad ogni
+\textit{stream} un opportuno blocco che deve essere implicitamente acquisito
+prima dell'esecuzione di qualunque operazione.
+
+Ci sono comunque situazioni in cui questo non basta, come quando un
+\textit{thread} necessita di compiere più di una operazione sullo
+\textit{stream} atomicamente, per questo motivo le librerie provvedono anche
+delle funzioni \funcd{flockfile}, \funcd{ftrylockfile} e \funcd{funlockfile},
+che permettono la gestione esplicita dei blocchi sugli \textit{stream}; esse
+sono disponibili definendo \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro
+prototipi sono:
+\begin{functions}
+ \headdecl{stdio.h}
+
+ \funcdecl{void flockfile(FILE *stream)} Esegue l'acquisizione del lock dello
+ \textit{stream} \param{stream}, bloccandosi se il lock non è disponibile.
+
+ \funcdecl{int ftrylockfile(FILE *stream)} Tenta l'acquisizione del lock
+ dello \textit{stream} \param{stream}, senza bloccarsi se il lock non è
+ disponibile. Ritorna zero in caso di acquisizione del lock, diverso da zero
+ altrimenti.
+
+ \funcdecl{void funlockfile(FILE *stream)} Rilascia il lock dello
+ \textit{stream} \param{stream}.
+\end{functions}
+\noindent con queste funzioni diventa possibile acquisire un blocco ed
+eseguire tutte le operazioni volute, per poi rilasciarlo.
+
+Ma, vista la complessità delle strutture di dati coinvolte, le operazioni di
+blocco non sono del tutto indolori, e quando il locking dello \textit{stream}
+non è necessario (come in tutti i programmi che non usano i \textit{thread}),
+tutta la procedura può comportare dei costi pesanti in termini di
+prestazioni. Per questo motivo abbiamo visto come alle usuali funzioni di I/O
+non formattato siano associate delle versioni \code{\_unlocked} (alcune
+previste dallo stesso standard POSIX, altre aggiunte come estensioni dalle
+\acr{glibc}) che possono essere usate quando il locking non serve\footnote{in
+ certi casi dette funzioni possono essere usate, visto che sono molto più
+ efficienti, anche in caso di necessità di locking, una volta che questo sia
+ stato acquisito manualmente.} con prestazioni molto più elevate, dato che
+spesso queste versioni (come accade per \func{getc} e \func{putc}) sono
+realizzate come macro.
+
+La sostituzione di tutte le funzioni di I/O con le relative versioni
+\code{\_unlocked} in un programma che non usa i \textit{thread} è però un
+lavoro abbastanza noioso; per questo motivo le \acr{glibc} forniscono al
+programmatore pigro un'altra via\footnote{anche questa mutuata da estensioni
+ introdotte in Solaris.} da poter utilizzare per disabilitare in blocco il
+locking degli \textit{stream}: l'uso della funzione \funcd{\_\_fsetlocking},
+il cui prototipo è:
+\begin{prototype}{stdio\_ext.h}{int \_\_fsetlocking (FILE *stream, int type)}
+ Specifica o richiede a seconda del valore di \param{type} la modalità in cui
+ le operazioni di I/O su \param{stream} vengono effettuate rispetto
+ all'acquisizione implicita del blocco sullo \textit{stream}.
+
+ \bodydesc{Restituisce lo stato di locking interno dello \textit{stream} con
+ uno dei valori \const{FSETLOCKING\_INTERNAL} o
+ \const{FSETLOCKING\_BYCALLER}.}
+\end{prototype}