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 :

Multithread - pointeur sur structure


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Points : 31
    Points
    31
    Par défaut Multithread - pointeur sur structure
    Bonjour à tous,

    je travaille sous WinXPSP3 / MS Visual Studio Express Edition 2008 / langage C.

    J'ai créé un pointeur *pTab sur un tableau de structure FLOW_UNIT_s de taille N.
    La structure FLOW_UNIT_s est décrite ci - dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct FLOW_UNIT_s{
    	time_t	tF;				
    	int inc;				
    	int cnt;				
    	double volt;			
    }FLOW_UNIT_s;
    La zone mémoire pointée par *pTab est actualisée en temps réel par un thread1. Le thread1 écrit dans *pTab, attend 40 ms, écrit dans *p(Tab+1), attend 40 ms, .... jusqu'à *p(Tab+N-1).

    Quand on arrive au Nième élément, un autre thread2 doit faire une copie de ce qui est contenu à l'instant t dans la zone mémoire pointée par *pTab (pendant ce temps, le thread1 continue à faire son travail, c'est à dire commence à écraser *pTab, *(pTab+1), ...).

    Ma question est la suivante : comment puis-je faire une copie du contenu de la zone mémoire pointée par *pTab à un instant donné dans une variable temporaire alors que le thread1 continue sa mise à jour ?

    J'ai défini un nouveau pointeur *pTab_temp = *pTab. Mais forcément la copie est actualisée en même temps que *pTab.

    Je suis preneur des idées que cette discussion vous inspirera.

    Merci d'avance.
    LePapat

  2. #2
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Tu as 2 thread qui tentent d'accèder à la même zone mémoire simultanément, un pour écrire, un pour lire.

    Je pense qu'il faut établir une section critique pour protéger ta zone mémoire.

    Sous Microsoft, regarde CRITICAL_SECTION et sous Linux, regarde semget()

    Un petit tuto sous Linux ici

  3. #3
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Tu as 2 thread qui tentent d'accèder à la même zone mémoire simultanément, un pour écrire, un pour lire.

    Je pense qu'il faut établir une section critique pour protéger ta zone mémoire.

    Sous Microsoft, regarde CRITICAL_SECTION et sous Linux, regarde semget()

    Un petit tuto sous Linux ici
    Non les sémaphores ne sont pas adaptés dans ce cas là, je verrais plutôt un mutex ou mieux, puisqu'il est question de multithread, utiliser les read write locks.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Pour ma part, je rendrais global (ou partagé si l'on parle de multi-processus) un tableau de "FLOW_UNIT_s*", protégé par un mutex attaché à ce tableau.

    Ensuite, la production / consommation se fait simplement en mettant à jour le pointeur d'une structure FLOW_UNIT_s dans le tableau, avec contrôle de mutex. Comme les données sont séparées (les threads n'utilisent pas les structures des petits copains), il n'y a pas de risque.

    Via par exemple InterlockedExchange ou autre fonction similaire, il n'y a carrément plus besoin de mutex sur le tableau...

    Ajout d'une structure :
    • Acquisition de la donnée.
    • Allocation d'une structure (malloc), et copie des données dedans.
    • Prise du mutex de tableau.
    • Recherche d'une case vide, ou ajout en "queue", au choix.
    • Mise à jour du tableau avec l'adresse de la structure allouée.
    • Libération du mutex.


    Retrait / consommation d'une structure :
    • Prise du mutex de tableau.
    • Rechercher de la première cellule non-vide.
    • Copie du pointeur dans le thread.
    • Positionnement de la cellule de tableau à NULL.
    • Libération du mutex.
    • Travail sur la structure.
    • Libération de la structure (free).


    Simple, efficace, et difficile de faire moins lourd... Si en plus le tableau est "circulaire" (solution préférable), et que l'on a accès aux fonctions Interlocked, alors il n'y a plus de mutex ni quoi que ce soit d'autre et on obtient en plus des performances maximales.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos retours tres instructifs.

    J'ai opte pour l'option mutex. Ca faisait un moment que je voulais la mettre en oeuvre.

    J'ai donc englobe mon tableau de structure FLOW_UNIT_s et un mutex dans une nouvelle structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct NEW_STRUCT_s{		
    	FLOW_UNIT_s flow[N];
    	pthread_mutex_t mutex_flow;		
    }NEW_STRUCT_s;
    mon pointeur *pTab pointe sur cette New structure. Les threads 1 & 2 fait toujours leur business mais le thread de copie est plus elabore avec pthread_mutex_lock/unlock quand je veux faire ma photo a l'instant t.

    J'ai une derniere question a propos du conseil de Mac Lak
    un tableau de "FLOW_UNIT_s*", protégé par un mutex attaché à ce tableau.
    En fait cette structure NEW_STRUCT_s contient d'autres champs qui sont modifies par d'autres threads. Est - il possible d'attacher le mutex uniquement au tableau de FLOW_UNIT_s et non a toute la structure NEW_STRUCT_S ?

    Merci d'avance.

    lePapat

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par LePapat26 Voir le message
    Est - il possible d'attacher le mutex uniquement au tableau de FLOW_UNIT_s et non a toute la structure NEW_STRUCT_S ?
    Quand on parle "d'attacher" un mutex à une entité, cela veut dire que l'on protège tout accès à cette entité par la prise / libération du mutex... Ce n'est donc en aucune façon automatique, et tu peux "attacher" un mutex à n'importe quoi... Y compris uniquement au 12ème bit du 4ème entier de ta structure si ça t'est nécessaire.

Discussions similaires

  1. pointeur sur structures
    Par Seimaya dans le forum Débuter
    Réponses: 33
    Dernier message: 26/08/2007, 18h13
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. pointeur sur structure
    Par julien.63 dans le forum C
    Réponses: 7
    Dernier message: 04/06/2007, 17h50
  4. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17
  5. Réponses: 2
    Dernier message: 21/03/2007, 10h55

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