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 :

Utilisation des mutex


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Utilisation des mutex
    Bonjour,

    Je recode un malloc et j'ai un soucis pour le rendre compatible multithread.
    J'ai besoin de mutex mais j'arrive pas a utiliser les mutex kernel d'unix et impossible de trouver un exemple d'utilisation sur le net.

    Je ne peux pas utiliser les mutex posix (pthread_mutex) car ils (d'apres ce que j'ai compris en lisant de la doc sur le net) font des appels a malloc. Du coup, ils ne sont pas utilisables.

    Je pense qu'il faut que j'utilise les fonctions qui sont definis ds le header sys/mutex.h.

    En faisant un define de _KERNEL j'arrive a inclure les entetes de fonctions, je peux declarer un mutex de type struct mtx mais impossible d'utiliser une des fonctions associes (mtx_init, mtx_lock ....)

    Voici ma ligne de compilation:
    cc main.c -D_KERNEL -W -Wall

    Voici l'erreur de compil:
    undefined reference to: mtx_init

    Est ce que je dois inclure une lib? Utiliser un autre type de mutex?
    Merci d'avance pour vos reponses!

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par Athel Voir le message
    Bonjour,

    Je recode un malloc et j'ai un soucis pour le rendre compatible multithread.
    J'ai besoin de mutex mais j'arrive pas a utiliser les mutex kernel d'unix et impossible de trouver un exemple d'utilisation sur le net.
    tout a fais normal si tu compile en user space, les mutex du noyau font appels a des mecanismes du noyau qui ne sont absolument pas accessible en user space.

    Citation Envoyé par Athel Voir le message


    En faisant un define de _KERNEL j'arrive a inclure les entetes de fonctions, je peux declarer un mutex de type struct mtx mais impossible d'utiliser une des fonctions associes (mtx_init, mtx_lock ....)
    sous linux il existe ce qu'on appel kernel space et user space (wiki est ton ami).
    en gros en kernel space tout est permis, mais en user space non.
    on ne peut pas appeler des methodes du noyau en userspace.


    Citation Envoyé par Athel Voir le message
    Voici ma ligne de compilation:
    cc main.c -D_KERNEL -W -Wall
    à éviter absolument, tu ne compile pas pour du kernel space, alors tu oublie KERNEL !


    Citation Envoyé par Athel Voir le message
    Voici l'erreur de compil:
    undefined reference to: mtx_init
    normal, le user space, comme dit plus haut, n'a pas accès aux symboles du kernel space !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Merci pour les precisions, je comprends un peu mieux pourquoi je ne peux pas les utiliser.
    Par contre je ne vois toujours pas comment ajouter des mutex a mon code sachant que les semaphores et les mutex pthread malloquent tous...

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    Tu n'as besoin que d'un seul mutex pour protéger ton malloc de la réentrance... Tu peux le créer à l'initialisation de ta librairie (via le malloc standard, donc), et ENSUITE ton malloc "à toi" sera utilisable, et protégé.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    J'ai deja essaye comme tu dis avec les mutex de la lib pthread mais j'ai des soucis avec.
    J'ai du mal a l'expliquer car d'apres ce que j'ai compris je ne devrais pas utiliser l'espace memoire reserve pour ce mutex dans mon malloc.
    Lorsque le prog fait appel a ma lib et fait son premier malloc je fais forcement un appel a sbrk pour reserver la place necessaire donc je ne peux pas ecrire sur l'espace reserve a ce mutex.
    Mais pour une raison qui m'echappe le prog segfault...

    Alors que ma lib fonctionne plutot bien puisque pour tous les programmes monotaches je n'ai pas de soucis...

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    Tu dois créer ce mutex AVANT d'initialiser / autoriser ton malloc à fonctionner !!!
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Mon malloc est dans une librairie dynamique.

    J'ai mis un mutex en variable globale qui est donc initialise lors du chargement de cette lib.

    Je vois pas comment proceder differemment.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    Tu l'as bien initialisé à PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, ce mutex ? Et tu as initialisé son attribut comment ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Mon erreur est certainement la.
    je l'ai declare comme ca:
    pthread_mutex_t mutex_malloc = PTHREAD_MUTEX_INITIALIZER;
    et ensuite je l'utilise normalement.

    J'essaie ca des que je peux.
    Merci

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    N'oublie pas l'attribut du mutex : lui aussi doit être déclaré et initialisé en global / statique.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Je compile sous un freeBSD 5 (pas tout jeune la bete!!) j'ai pas cette fonction PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP.

    Je me suis debrouille autrement, j'ai implemente l'algo de semaphores de dijkstra en utilsation les instructions atomiques disponibles.
    C'est pas optimal par contre puisque il y a potentiellement un peu d attente active...

    J'ai essaye de voir du cote des attributs de mutex mais sans succes.

    Si tu as un exemple sous la main je suis preneur!
    Merci pour ton aide

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    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
    Pas sous le coude, hélas, et encore moins pour l'OS que tu utilises... Je n'utilise pas beaucoup les pthreads directement, je passe en général par une librairie d'abstraction.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Le _NP dans PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP veut dire "non portable" Il suffit d'utiliser les fonctions POSIX:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pthread_mutexattr_t   mattr;
     
    pthread_mutexattr_init(&mattr);
    pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(&mutex, &mattr);
    pthread_mutexattr_destroy(&mattr);
    /* ... */
    pthread_mutex_destroy(&mutex);
    Un peu plus lourd mais bon... Et attention aux retours de fonctions

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Je vois mieux ce qui me manquait, merci!

    Par contre j'ai du mal a comprendre que sur tous les tutos que j'ai regarde, aucun ne parle de l'initialisation de l'attribut du mutex..

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Je te conseille le "pthread programming guide" de Sun en telechargement gratuit, il couvre tout ca (ainsi que les extensions de Solaris mais il est toujours precise si la fonction est standard ou pas).

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Merci pour le lien, c est ce que je cherchais!

Discussions similaires

  1. Dans quels cas est-on obligés d'utiliser des mutex ?
    Par kidpaddle2 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 18/07/2010, 20h05
  2. Réponses: 4
    Dernier message: 21/08/2009, 10h48
  3. Pratique d'utilisation des mutexes
    Par FabaCoeur dans le forum C
    Réponses: 4
    Dernier message: 29/01/2009, 15h08
  4. Utilisation des mutex et des threads
    Par Chen norris dans le forum SDL
    Réponses: 4
    Dernier message: 31/08/2007, 00h00
  5. Utilisation des Mutex
    Par jordy16 dans le forum C++Builder
    Réponses: 3
    Dernier message: 09/12/2004, 09h02

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