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

Threads & Processus C++ Discussion :

Conflit de Thread


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut Conflit de Thread
    Salut !

    Je ne suis pas expert en C++, j'ai ecris pas mal de programes mais je ne me suis jamais vraiement lancé sur les threads.

    Je bosse sous linux, j'ai etudié à droite et à gauche les threads mais je n'ai pas trouvé de réponse à ma question. Il me semble avoir compris que pour lire des données, les threads ne pausent pas de soucis. La ou ça coince c'est quand on modifie des variables. La dessus vive les mutex et autres sémaphores. Ce que je ne pige pas c'est quel est le seuil critique...

    Je veux dire est-ce critique si 2 thread cherchent à modifier le même int en même temps ? Est-ce q'un troisieme thread qui cherche à lire ce int peut avoir autre chose que la valeur du thread 1 ou 2 ? Est-ce qu'il peut y avoir un crash du preocess à ce stade ?


    Je me pose la même question pour ce qui est des pointeurs. Si je cherche à acceder à un objet :

    a->b->c->monInt=10

    Est-ce q'il peut se passer qq chose entre a->b et b->c ? Est-ce q'un thread peut avoir le temps d'effectuer une tache alors que le premier est en train de rentrer dans l'arbre ?

    Merci à vous !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Les problèmes de concurrence ne peuvent se poser bien évidemment que si plusieurs threads tentent de modifier une valeur de manière concurrente, ou si certains tentent de lire pendant que d'autres la modifient.

    Avec un seul cœur, réaliser toute opération non atomique en concurrence est dangereux.
    Avec plusieurs cœurs, réaliser toute opération atomique en concurrence sans barrières est aussi dangereux.

    En pratique, je doute que ça puisse planter, tu auras juste une valeur non définie.

    Pour bien faire les choses, il faut donc utiliser les primitives de synchronisation de la bibliothèque de threads que tu utilises.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Merci loufoque

    Donc j'imagine que a->b->c->monInt=10 est pas atomique !

    Comment savoir ce que fait le compilateur deriere tout ça pour determiner ce qui est atomique et ce qui ne l'est pas ?

    EDIT : Je pose cette question pour eviter les deadlock qui dans mon cas risque de couter cher au systeme :/

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par seal3 Voir le message
    Donc j'imagine que a->b->c->monInt=10 est pas atomique !
    Ca dépend, c'est quoi la variable/zone mémoire partagée et à protéger ?

    Si c'est juste "monInt", cette opération doit être atomique. par contre si l'un des pointeurs a, b et/ou c qui est partagé entre les threads, là effectivement, l'opération risque de ne plus être atomique puisque l'évaluation doit être faite.

    Pour info, monInt = monInt + 5 n'est pas atomique non plus.

    Citation Envoyé par seal3 Voir le message
    Comment savoir ce que fait le compilateur deriere tout ça pour determiner ce qui est atomique et ce qui ne l'est pas ?
    En regardant le code assembleur généré ou alors en lisant les spec (désolé, j'ai pas mieux). En général, les opérations atomiques sont clairement indiquées.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 113
    Par défaut
    Merci beaucoup pour les infos

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ajouterai (comme l'a dis loufoque mais peut être en moins clair), sur les processeurs actuels, *aucune* opération n'est vraiment atomique sans la pose explicite de "barrière". De toute manière, cette manière de programmer ne "tiens" pas la route (machines multi-processeurs).

    Il ne sert donc à rien de regarder le code généré... par telle ou telle instruction C++ elle ne sera de toute manière pas protégée (à moins de forcer explicitement le programme à tourner sur un seul coeur).

    Tous les OS (et CPU multi-coeurs) proposent des instructions de barrieres (comme InterlockedIncrementAcquire / InterlockedIncrementRelease ...)... mais qui ne sont pas sans coût...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/10/2009, 16h28
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. conflits avec plusieurs thread ?
    Par ac/dc dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/04/2007, 20h47
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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