2020-09-29 13:53:27 +02:00
|
|
|
\chapter{threads}
|
|
|
|
\index{threads}
|
|
|
|
|
|
|
|
% ----------------------------------------------------------------
|
|
|
|
|
2020-11-22 21:07:05 +01:00
|
|
|
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
|
2020-09-29 13:53:27 +02:00
|
|
|
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
|
2020-11-25 14:24:19 +01:00
|
|
|
«~se partagent la même mémoire globale~». Et en français de tous
|
|
|
|
les jours, «~ils vont se marcher sur les pieds~».
|
2020-09-29 13:53:27 +02:00
|
|
|
|
2020-11-25 14:24:19 +01:00
|
|
|
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.
|
|
|
|
|
2020-11-27 14:44:53 +01:00
|
|
|
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.
|
2020-11-25 14:24:19 +01:00
|
|
|
|
|
|
|
%
|
2020-09-29 13:53:27 +02:00
|
|
|
% ----------------------------------------------------------------
|
|
|
|
|
|
|
|
\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
|
|
|
|
|
2021-01-20 04:53:48 +01:00
|
|
|
Une seconde : \ref{chap:IPC}, page \pageref{chap:IPC}.
|
|
|
|
|
2020-11-25 14:24:19 +01:00
|
|
|
% ----------------------------------------------------------------
|
2020-09-29 13:53:27 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|