RECHERCHE

Plan du site

BOURSE

 

RUBRIQUES

 
 TUTORIEL ALGO/METHODES 
Programmation Orientée Objet : le multithreading
Exécuter plusieurs processus en même temps et de manière quasi transparente, voilà l'objectif du parallélisme, dont les applications sont omniprésentes dans l'informatique. (08/03/2005)
Explication
La notion de parallélisme, couramment appelée multithreading, est fondamentale car rendue nécessaire par l'utilisation qui est aujourd'hui faite des ordinateurs. Si la préhistoire de l'informatique n'autorisait le déroulement que d'une seule tâche, le besoin d'en faire fonctionner deux, puis très vite une multitude s'est fait sentir. Les systèmes d'exploitation actuels, obligatoirement multitâches (ils permettent de lancer plusieurs applications à la fois) sont le reflet de cette évolution ; à son échelle, le multithreading est une forme de multitâche.

La conception même de nos ordinateurs (basés encore sur la machine de Von Neumann, qui fonctionne de manière séquentielle) oblige les programmes à jongler avec les tâches qu'ils lancent, et les processeurs à trier par priorité les demandes qui leurs sont envoyées. En résumé, les programmes d'aujourd'hui demandent à un système séquentiel de fonctionner de manière apparemment parallèle (ou pseudoparallèle), d'où le multithreading.

Multithreading sous-entend thread, ou processus. Si une application est une tâche au sein d'un système multitâche, on peut considérer le thread comme étant une minitâche. Plus prosaïquement, là où l'application est considérée comme un processus lourd, notre minitâche/thread est un processus léger. Ces processus correspondent à une poignée d'instructions envoyées au processeur, celui-ci se chargeant, par le biais d'un répartiteur, de leur allouer quelques cycles de calcul. Le cycle terminé, le processeur passe à la minitâche suivante et lui alloue les cycles suivants, quitte à revenir ensuite sur la première minitâche. Le but, en définitive, est de donner l'impression d'exécuter toutes ces instructions en même temps.

Le processeur passe ainsi d'un processus à l'autre de manière strictement séquentiel (la seule différence offerte par un processeur plus récent est la vitesse à laquelle il exécute les tâches). Chaque thread est ainsi géré de la même manière - sauf le cas où un thread se voit assigné une priorité par le système d'exploitation), où si le thread doit, durant son temps alloué, attendre le résultat d'un appel de ressources (mémoire, disques, réseau...). Entre chaque "passage de thread", le processeur mémorise les informations nécessaires à la reprise de ce thread, afin de pouvoir le replacer en contexte lors de cette reprise.

Toutes les activités critiques, qui nécessitent une attention constante de la part du processeur ou qui prennent beaucoup de temps, doivent être placées dans un thread. C'est ici que le choix du développeur se pose : mettre ou non une classe "en thread".

Implémentation
Chaque langage implémente le multithreading à sa manière, et le résultat en mémoire peut varier d'une plate-forme à l'autre. En Java et C#, les applications sont naturellement en parallèle, car chaque application dispose d'un thread implicite, où tourne le ramasse-miettes (garbage collector).

Java, pour commencer, dispose de deux techniques pour faire appel au multithreading :
- étendre la classe visée en la faisant hériter de Thread (plus précisément, java.lang.Thread)
- faire implémenter l'interface Runnable à la classe.

Dans les deux cas, la classe devrait redéfinir une méthode run() de Thread.

public class ClasseMaitresse {
  public static void main(String[] args) {
    LaClasse activite = new LaClasse ();
    Thread t = new Thread(activite);
    t.start();
    }
  }
public class LaClasse implements Runnable {
  public void run() {
    // les activités à exécuter
    }
  }


C#, de son côté, n'implémente pas le multithreading par héritage, mais par composition : le développeur dispose de la classe System.Threading.Thread et du délégué System.Threading.ThreadStart.

using System.Threading;
Thread unThread = new Thread(new ThreadStart(LaClasse.laMethode() )); unThread .Start();



  Forum

Réagissez dans les forums de JDN Développeurs

S'il ne faut pas abuser des threads (toutes les classes n'ont pas besoin de faire appel à un thread à part), leur connaissance et leur bon usage permet de toute façon de mieux contrôler l'exécution de son programme, pour en définitive développer une application qui fonctionne non seulement avec ses propres activités, mais également en parallèle avec les autres.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 



Votre avis sur cette publicité


Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages