You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.9 KiB
84 lines
2.9 KiB
\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. |
|
|
|
% ---------------------------------------------------------------- |
|
\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}. |
|
|
|
% ---------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|