IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Variables globales, structures et threads


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Variables globales, structures et threads
    Bonjour à tous,

    Le contexte d'abord : je travaille sur un programme en C pour de l'embarqué.
    Dans un premier temps j'avais déclaré mes variables qui sont utilisées dans plusieurs fonctions en globales pour ne pas être embété.
    Certaines de ces variables sont lues dans un fichier de configuration au début puis utilisées régulièrement, d'autres sont mises à jour et relues par plusieurs fonctions qui tournent dans différents threads.
    Je souhaite maintenant rendre le programme plus propre en évitant d'utiliser ces variables globales. Je pense qu'il faut passer par des structures que je passerais à toutes les fonctions qui en ont besoin.
    Mais ces fonctions sont elles-même appelées par des theards différents, et donc je ne sais pas trop comment m'en sortir.
    Ma question est donc la suivante : quelle est la "bonne" façon de faire ? C'est-à-dire la plus propre et la plus simple à la fois ?

    Merci d'avance pour votre aide !

  2. #2
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Bonjour,

    Que deux structures utilisent en même temps une fonction ne pose pas problème.

    Par contre, si deux threads accèdent à une même variable/structure avec au moins l'un des deux en écriture, il peut y avoir des problèmes d'accès concurrents.

    En C, une façon classique est d'utiliser des mutex.

    Il suffit d'entourer tes accès à ta variable avec un tel mutex:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pthread_mutex_lock(&mutex);
    monAccesCritique();
    pthread_mutex_unlock(&mutex);

    Évite les variables globales. C'est rapidement difficilement maintenable. Par contre tu peux passer une structure à un thread à sa création contenant tout ce dont il aura besoin avec le dernier paramètre de pthread_create .

  3. #3
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Pour commencer à faire propre dans votre code source, il est impératif et vital de synchroniser vos threads avec des mutex (c'est le minimum à faire) afin d'éviter des situations de blocage voir pire, corruption de données et ce tout simplement parce que tout thread crée en un accès immédiat et partagé à l'ensemble de vos variables globales (les descripteurs de fichiers y passent). En d'autres termes, n'importe quel thread peut modifier à tout instant la valeur de vos variables globales.

    Dans le cas ou cela ne satisfait pas vos demandes, il y a la variante des mutex les R/W locks qui est un ensemble de verrous très semblables à ceux des mutex sauf qu'au moment du verrouillage, on indique juste si on souhaite seulement lire les données ou si on risque aussi de les modifier.

    Initialisation de ces verous se fait de façon dynamique avec int pthread_rwlock_init(pthread_rwlock_t *rw, const pthread_rwlockattr_t *attr); ou de façon statique avec pthread_rwlock_t wr = PTHREAD_RWLOCK_INITIALIZER;
    Citation Envoyé par emixam16 Voir le message
    Il suffit d'entourer tes accès à ta variable avec un tel mutex:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pthread_mutex_lock(&mutex);
    monAccesCritique();
    pthread_mutex_unlock(&mutex);

    Attention, il ne suffit pas seulement d'entourer la variable globale, il faut également tester la valeur retour des fonctions qui entoure cette variable. Dans le cas présent, si elle échoue il y a une race condition qui débouche à la fin à un blocage

    À bientôt,
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous les deux et merci pour vos réponses.

    Mieux vaut éviter les variables globales donc, je m'en doutais.
    Je n'ai pas trop de souci à gérer les ressources partagées avec mutex etc, je devrais m'en sortir.

    Il reste une partie de la question non résolue
    Si dans mon main je lis un paquet de variables en début de programme que je stocke dans des tableaux et / ou structures. Ensuite j'appele les threads qui travaillent avec ces valeurs, commennt je peux passer toutes ces variables contenues dans plusieurs tableaux / structure puisque le pthread_create permet le passage d'un seul argument seulement ?

    Merci d'avance,

    Guillaume

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Tu connais déjà la réponse je pense mais c'est toujours pareil. On utilise le principe de la poupée russe. Crées une structure qui va englober tous les tableaux et variables dont tu as besoin. tu déclares une variable du type de la structure dans le main et tu passes son pointeur au p_thread.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ah oui, évidemment ! =)

    Merci !

    Guillaume

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/04/2010, 12h40
  2. [MT] thread et variable globale
    Par r0d dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 15/08/2007, 02h18
  3. Réponses: 4
    Dernier message: 04/02/2007, 19h39
  4. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo