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 :

Processing parallele et accès a une ressource


Sujet :

Threads & Processus C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut Processing parallele et accès a une ressource
    Bonjour,

    Je suis sur un programme qui effectue des traitement sur des blocs de données partagés.
    J'ai plusieurs thread qui ont accès à ces blocs de données et ils doivent faire des calculs sur ces blocs.

    Pour cela j'ai donc cré un bloc de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class Block
    {
     
    public:
        int X;
        int Y;
        volatile int Processed;
        double tab[64];
     
        Block(int Xin,int Yin){X=Xin;Y=Yin;Processed=0;}
    };
    Et j'ai mon code dans mon thread qui accède à mon bloque. Pour empécher l'accès du bloque à d'autre thread, je met la variable à 1 et je teste avant l'accès au bloque si cette variable est a 1. Si elle est a un je ne fais pas de calcul comme dans le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    vector <Block *> * Regions = t->DCTBuf[0]->Regions;
        unsigned int size = Regions->size();
     
        while(!j)
        {
     
            if( (*Regions)[i]->Processed == 1)
            {
                fprintf(fp,"CPU %d region %d offset %d\n",CPU,i,0);
                (*Regions)[i]->Processed++; // Fermeture de l'acces au block
                t->ProcessBlock((*Regions)[i],0);
     
            }
     
            i++;
            if(i >= size )
            {
                j = 1;
                break;
            }
        }
    Pour vérifier que ca fonctionne bien j'écris dans un fichier les différents accès aux ressourses.

    Le problème c'est que visiblement malgrès le teste avant le traitement du bloque, il semblerait que certains bloques soient traités plusieurs fois.

    Pourquoi ca se produit alors que j'ai fait en sorte de faire un teste avant le traitement ?

    Si quelqu'un peut m'éclairer?

    D'avance merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Il y a une race condition entre le test de Processed et sa modification. Entre ces deux moments, un autre thread peut lui aussi lire Processed, voir qu'il est à zéro et se préparer à modifier...

    Tu devrait utiliser les outils spécifiques au multithreading pour verrouiller tes blocs. Ou au moins, utiliser une fonction atomique de test-and-set (comme InterlockedCompareExchange() sous Windows) à la place de ta lecture et écriture séparées.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    on synchronise avec des mutex pas avec des variables volatile.

Discussions similaires

  1. droits d'acces a une ressources
    Par Hinault Romaric dans le forum ASP.NET
    Réponses: 6
    Dernier message: 31/01/2010, 16h45
  2. Acces a une ressource JDK 1.3
    Par seddik_saber dans le forum JSF
    Réponses: 1
    Dernier message: 01/03/2007, 15h53
  3. Accès au fichier ressources depuis une classe action
    Par root76 dans le forum Struts 1
    Réponses: 2
    Dernier message: 21/11/2006, 07h36
  4. [Debutant] Acces à une ressource d'une archive différente.
    Par Gandor dans le forum Général Java
    Réponses: 2
    Dernier message: 30/07/2004, 19h37
  5. Accès à une ressource ?
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2004, 16h29

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