X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;fp=filestd.tex;h=d7e4b67f68b03b531a54cb2226e9b2cc6b5712d6;hp=1c69ca2f826bdcc6e7b876da113dfcb6654961ba;hb=b2fde72b2f308cb35873f1fd050501af6a742bc0;hpb=6ca77550fb420b3948b95a60ff79f7e282c12d34 diff --git a/filestd.tex b/filestd.tex index 1c69ca2..d7e4b67 100644 --- a/filestd.tex +++ b/filestd.tex @@ -541,8 +541,8 @@ eventuali differenze. Le \acr{glibc} definiscono altre due funzioni per l'I/O binario, \funcd{fread\_unlocked} e \funcd{fwrite\_unlocked} che evitano il lock implicito dello stream, usato per dalla librerie per la gestione delle -applicazioni multi-thread (si veda sez.~\ref{sec:file_stream_thread} per i -dettagli), i loro prototipi sono: +applicazioni \itindex{thread} \textit{multi-thread} (si veda +sez.~\ref{sec:file_stream_thread} per i dettagli), i loro prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -1319,7 +1319,7 @@ sistemi pi In questa sezione esamineremo alcune funzioni avanzate che permettono di eseguire operazioni particolari sugli stream, come leggerne gli attributi, controllarne le modalità di bufferizzazione, gestire direttamente i lock -impliciti per la programmazione multi thread. +impliciti per la programmazione \itindex{thread} \textit{multi-thread}. \subsection{Le funzioni di controllo} @@ -1540,29 +1540,32 @@ scrittura), e tutto l'input non ancora letto (se compresi gli eventuali caratteri rimandati indietro con \func{ungetc}. -\subsection{Gli stream e i thread} +\subsection{Gli \textit{stream} e i \textit{thread}} \label{sec:file_stream_thread} -Gli stream possono essere usati in applicazioni multi-thread allo stesso -modo in cui sono usati nelle applicazioni normali, ma si deve essere +\itindbeg{thread} + +Gli 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 -thread, dato che l'implementazione delle librerie è influenzata -pesantemente dalle richieste necessarie per garantirne l'uso con i thread. +\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 thread, per questo le operazioni sui buffer effettuate dalle funzioni di -libreria durante la lettura e la scrittura di uno stream devono essere -opportunamente protette (in quanto il sistema assicura l'atomicità solo per le -system call). Questo viene fatto associando ad ogni 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 thread -necessita di compiere più di una operazione sullo 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 stream; esse sono disponibili definendo -\macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: +ai \textit{thread}, per questo le operazioni sui buffer effettuate dalle +funzioni di libreria durante la lettura e la scrittura di uno stream devono +essere opportunamente protette (in quanto il sistema assicura l'atomicità solo +per le system call). Questo viene fatto associando ad ogni 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 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 stream; esse sono disponibili +definendo \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -1581,8 +1584,8 @@ 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 stream non è -necessario (come in tutti i programmi che non usano i thread), tutta la -procedura può comportare dei costi pesanti in termini di prestazioni. Per +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 @@ -1593,8 +1596,8 @@ con prestazioni molto pi 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 thread è però un lavoro -abbastanza noioso; per questo motivo le \acr{glibc} forniscono al +\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 stream: l'uso della funzione \funcd{\_\_fsetlocking}, il cui @@ -1620,6 +1623,9 @@ che pu di blocco dello stream. \end{basedescript} +\itindend{thread} + + %%% Local Variables: %%% mode: latex