Some C source code for programming multithreading examples Solaris, FreeBSD, OpenBSD, NetBSD, Linux, MkLinux and GNO : program your kernel in C. ***** First example : a program that copy files ***** Version synchrone : algorithme séquentiel non parallèle while(1) { nb = read (src, tampon, TAILLE_TAMPON); if (nb <= 0) break; else write (dest, tampon, nb); } En version parallèle, on est confronté au problème classique du producteur/consommateur avec un seul producteur et un seul consommateur mais il faut disposer d'au moins deux tampons. Si tel n'est pas le cas, il faudra gérer l'accès à ce tampon en exclusion mutuelle et on se trouvera dans une situation similaire à une implémentation séquentielle. En effet, le producteur et le consommateur ne pourraient s'exécuter chacun à leur tour, ce qui reviendrait à une exécution séquentielle. producteur() { np = 0; while (1) { sema_wait (tampon_vide); desc [np].nb = read (src, desc[np].tampon, TAILLE_TAMPON); sema_post (tampon_plein); if (desc [np].nb <= 0) break; np = (np + 1) % NB_TAMPONS; } } consommateur () { nc = 0; while (1) { sema_wait (tampon_plein); if (desc [nc].nb <= 0) break; write (dest, desc [nc].tampon, desc [nc].nb); sema_post (tampon_vide); nc = (nc + 1) % NB_TAMPONS; } } ***** Second example : client/server programming ***** ecrire (file_attente, message) { mutex_lock (file_attente.mutex); if (file_vide (file_attente)) cond_signal (file_attente.C_vide); ajouter (message, file_attente); mutex_unlock (file_attente); } lire (file_attente, message) { mutex_lock (file_attente.mutex); while (file_vide (file_attente)) cond_wait (file_attente.C_vide, file_attente.mutex); retirer ( message, file_attente); mutex_unlock (file_attente.mutex); }