Aller au contenu

Introduction aux threads

Un thread est un processus unique servant à exécuter du code. Lors de l'exécution de programmes, un thread est lancé et le code est exécuté. C'est ainsi que chacun des programmes sont lancés depuis le tout début.

Thread unique

Imaginons un programme simple qui effectue deux tâches longues : Télécharger un fichier et trouver le prochain nombre premier :

flowchart
    url[Demander un URL] --> nombre[Demander un nombre]
    nombre --> telecharger(Télécharger le fichier donné par l'URL)
    telecharger -- Longue attente --> fichier[(fichier.bin)]
    fichier --> trouver(Trouver le prochain nombre premier)
    trouver --> premier[Affichage à l'écran]

Si toutes les instructions sont effectuées dans un seul thread, le tout est linéaire. On devra attendre que le fichier soit téléchargé au complet avant de commencer le calcul du prochain nombre premier. Ce n'est pas très efficace.

Plusieurs threads

En utilisant une approche multi-thread, on pourrait lancer les deux tâches dans des threads séparés. Ceci aurait comme résultat d'effectuer les tâches simultanément :

flowchart TB

    subgraph thread1[Premier thread]
    direction TB
    telecharger(Télécharger le fichier donné par l'URL) -- Longue attente --> fichier[(fichier.bin)]
    end

    subgraph thread2[Second thread]
    direction TB
    trouver(Trouver le prochain nombre premier) --> premier[Affichage à l'écran]
    end

    subgraph main[Thread principal]
    direction TB
    url[Demander un URL]
    --> nombre[Demander un nombre]
    --> continuer[Continuer le processus]
    --> continuer2[D'autres instructions]
    end

    nombre -.-> thread2
    url -.-> thread1

Dans ce second exemple, on démarre un nouveau thread après chaque question. Le thread effectuera son travail pendant que le thread principal continue son exécution.

Client et serveur

Ce dernier exemple reprend l'application du blackjack. Une seule personne pouvait jouer au blackjack à la fois :

flowchart LR

    serveur[Le serveur]
    client1[Client 1]
    client2[Client 2]
    client3[Client 3]

    client1 --> c1{{Veut jouer}} -- Connexion réussie --> serveur
    client2 --> c2{{Veut jouer}} -- Connexion impossible --- serveur
    client3 --> c3{{Veut jouer}} -- Connexion impossible --- serveur

    linkStyle 1 stroke:#0f0,stroke-width:4px,color:blue;
    linkStyle 3,5 stroke:#ff3,stroke-width:4px,color:red;

Le client n'ayant qu'un seul thread, il ne pouvait s'occuper que d'un seul client à la fois. Avec la venue du multi-thread, il serait alors possible de gérer chaque connexion dans un thread séparé et ainsi d'avoir plusieurs client en même temps :

flowchart TB

    subgraph LeServeur[Le serveur]
        subgraph th1[Thread Client 1]
        j1[Jouer au blackjack]
        end

        subgraph th2[Thread Client 2]
        j2[Jouer au blackjack]
        end

        subgraph th3[Thread Client 3]
        j3[Jouer au blackjack]
        end

        subgraph main[Thread principal]
        attendre
        end
    end

    attendre["Attendre une connexion (accept())"]
    client1[Client 1]:::client1
    client2[Client 2]:::client2
    client3[Client 3]:::client3

    client1 --> c1{{Veut jouer}} -- Connexion réussie ---> LeServeur
    client2 --> c2{{Veut jouer}} -- Connexion réussie ---> LeServeur
    client3 --> c3{{Veut jouer}} -- Connexion réussie ---> LeServeur

    attendre -.-> th1:::client1
    attendre -.-> th2:::client2
    attendre -.-> th3:::client3

    classDef client1 fill:#090
    classDef client2 fill:#900
    classDef client3 fill:#00F,color:#FFF
    linkStyle 1,3,5 stroke:#0F0,stroke-width:4px,color:blue;

Non seulement plusieurs clients pourront jouer au blackjack, mais il serait même viable de les faire jouer ensemble.