Cours:InfoEmbarqueeThread : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(spécialisation de la classe QThread)
(spécialisation de la classe QThread)
Ligne 98 : Ligne 98 :
 
void Worker::run()
 
void Worker::run()
 
{
 
{
     // exec();
+
    // les objets qui "vivent" dans le thread doivent être créés dans la méthode '''run'''
 +
     // exec(); // =>lance la boucle d'événement QT
 
}
 
}
 
</source>
 
</source>

Version du 2 octobre 2023 à 10:21

Kesako

Pile/Tas

zone mémoire Taille Usage Performances
Stack (pile) fixe variables/paramètres ... des fonctions selon mémoire
Heap (tas) sans objet allocation dynamique un peu moins rapide (gestion du tas, partage entre thread => doit être thread-safe)


utilisation de la pile utilisation du tas
int f1(int n)
{
   int res;
   res= ...n1;
   return res;
}

int main()
{
  int a,b;
  b=f1(a);
}
int* memoireAllouee = nullptr; // On crée un pointeur sur int
memoireAllouee = malloc(sizeof(int)); // La fonction malloc inscrit dans notre pointeur l'adresse qui a été reservée.

Complexe * z1 = new Complexe(2,5);

Processus

Le lancement d'un programme sous Unix (norme posix ) entraîne la création d'un nouveau processus et donc l'allocation d'une zone mémoire avec plusieurs parties :

ProcessusUnix.gif


  • le segment texte qui contient le programme exécutable
  • le segment statique qui contient les objets globaux et statiques
  • le segment de pile ( stack ) qui contient les données des fonctions
  • le segment de tas ( heap ) qui contient les données allouées dynamiquement ( new / malloc )

Thread

un thread (fil d'instruction, processus léger,...) représente l'exécution d'en ensemble d'instructions.

un processus peut exécuter plusieurs threads. Les threads d'un même processus partagent une grande partie de leur mémoire (mis à part la pile)

L'ordonnanceur du système d'exploitation exécutera les différents threads qui pourront sembler s'exécuter en parallèle même sur un processeur à un seul coeur (core).


ThreadPosix.png


Attention à la durée de vie des objets dans la pile !!! => préférez le tas ?!


spécialisation de la classe QThread

worker.h worker.cpp
class Worker : public QThread
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);
    void run() override;
};
Worker::Worker(QObject *parent)
    : QThread{parent}
{
}

void Worker::run()
{
    // les objets qui "vivent" dans le thread doivent être créés dans la méthode '''run'''
    // exec(); // =>lance la boucle d'événement QT
}

Mutex

Dans chaque thread on distingue :

  • section non critique : peut être exécuté sans coordination avec les autres threads
  • section critique  : doit être exécuté par un thread unique => exclusion mutuelle
Un mutex (mutual exclusion) est une structure de données qui permet de contrôler l'accès à une ressource

Un mutex :

  • est associé à une ressource
  • peut être
    • unlocked : la ressource est libre
    • locked  : la ressource est utilisée


Avant chaque accès à une section critique, il convient de :

  • demander le verrouillage du mutex
  • exécuter la section critique
  • libérer le mutex

Ressources