POSIX Threads

Un même processus peut se décomposer en plusieurs morceaux, qui vont s'exécuter simultanément (éventuellement sur plusieurs processeurs, si la machine en a plusieurs), en partageant les mêmes données. C'est beaucoup moins lourd que la commande fork() et les histoires de mémoire partagée. Il n'y a qu'un seul processus.
Il est aussi possible de faire ça en Perl, mais c'est expérimental, et compiler Perl avec ce genre de choses fait planter dertains modules (en particulier, Gimp).

THREADS
  #include <pthreads.h>
  pthread_t my_thread;
  void * thread_function(void * a){ ... }

  /* on lance le thread (NULL, c'est l'argument de thread_function) */
  pthread_create(&my_thread, thread_function, NULL);

  /* On fait ce que l'on a à faire */
  /* ... */

  /* on attend que le thread se termine */
  pthread_join(&my_thread, NULL);

MUTEX
Il est parfois nécessaire d'interdire momentanément certaines opérations d'un (ou plusieurs) thread(s) : par exemple, si plusieurs threads sont amenés à lire une variable, faire des calculs avec puis modifier cette variable en fonction du résultat de ces calculs (prosaïquement, ça veut dire incrémenter une variable ; mais plus généralement, cela concerne toutes les opérations de lecture et d'écriture d'une variable), il ne faut pas qu'ils le fassent en même temps.
Mutex signifie « mutual exclusion » (exclusion mutuelle, en français)
  pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;

  /* on réquisitionne my_mutex ; s'il est déjà utilisé par un thread, on 
     attend qu'il se libère */
  pthread_mutex_lock(&my_mutex);

  /* ... */ /* On fait ce  que l'on a à faire */

  /* On libère le mutex */
  pthread_mutex_unlock(&my_mutex);

SIGNAUX ENTRE THREADS
Les « signaux » entre threads s'appellent des « conditions », mais je préfère le terme plus clair de « signal ». On peut envoyer un signal à un thread en particulier ou à tous les threads.
  /* J'ai oublié de déclarer my_cond */
  /* ... *

  /* Thread 1 : wait for a signal */
  pthread_mutex_lock(&my_mutex);
  pthread_cond_wait(&my_cond, &my_mutex);
  pthread_mutex_lock(&my_mutex);

  /* Thread 2 */
  pthread_mutex_lock(&my_mutex);
  /* ... */
  pthread_mutex_unlock(&my_mutex);
  pthread_cond_broadcast(&my_cond);

Vincent Zoonekynd
<zoonek@math.jussieu.fr>
latest modification on lun mai 7 13:12:33 CEST 2001