TetaTricks/chap/threads.tex

86 lines
2.9 KiB
TeX

\chapter{threads}
\index{threads}
% ----------------------------------------------------------------
Ahemmm, par quoi commencer\footnote{Par de l'aspirine ?} ?
La programmation avec les fils d'exécution est un espace
rempli de chausse-trappes.
Par un
extrait de la page \texttt{pthreads(6)} ? Voilà, ça c'est bien :
\begin{quote}
POSIX.1 specifies a set of interfaces (functions, header files) for
threaded programming commonly known as Pthreads.
A single process can contain multiple threads, all of which are
executing the same program. These threads share the same global
memory (data and heap segments), but each thread has its own stack
(automatic variables).
\end{quote}
Et c'est là que les ennuis potentiels débarquent :
\textit{share the same global memory}, ce qui veut dire en gros
«~se partagent la même mémoire globale~». Et en français de tous
les jours, «~ils vont se marcher sur les pieds~».
D'un autre coté, ce paradigme permet de faire des choses assez
choupi, comme un « synthétiseur d'évènement», notion que noue allons
bientôt contempler.
% ----------------------------------------------------------------
\section{Un exemple}
Nous allons partir sur un exemple peu réaliste, mais simple
à comprendre. Nous aurons un seul fil d'exécution qui affichera
un compteur, puis l'incrémentera. Pendant ce temps, la branche
principale du programme mettra du random dans le compteur, en
espérant perturber l'autre branche.
\lstinputlisting[language=c]{code/thread-demo.c}
Voilà, nous avons là deux \textsl{race conditions} qui
peuvent avoir des effets pervers~: Ils vont
effectivement se marcher sur les pieds.
Dans le thread
(la fonction \texttt{fil}), le
compteur est incrémenté, \textbf{puis} il est affiché.
Si la branche principale poke du random dans le compteur
entre ces deux opérations, *paf* le chien.
Et réciproquement, si le \texttt{main} pose son aléa dans
le compteur, \textbf{puis} l'affiche, cet aléa peut avoir
été incrémenté par l'autre partie du processus.
Un esprit pervers vient quand même modérer ces affirmations
en prétendant que dans ces deux cas, les \textsl{race conditions}
pourraient dépendre des optimisations du compilateur,
et de l'utilisation du \texttt{volatil} pour notre compteur.
%
% ----------------------------------------------------------------
\section{ITC}
\index{ITC}
\textit{Inter Thread Communication}
Imaginons une application avec un thread qui fait le travail effectif
(nous le nommerons \textsl{worker}), et plusieurs autres threads
qui attendent des ordres de l'extérieur (telnet, MIDI\index{MIDI},
joystick\index{joystick}\dots) et qui doivent passer ces commandes
au \textsl{worker}.
Comment allons-nous procéder\footnote{Et c'est une vraie question !} ?
Une première piste : http://tools.ietf.org/html/rfc3117
Une seconde : \ref{chap:IPC}, page \pageref{chap:IPC}.
% ----------------------------------------------------------------