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

Réseau C Discussion :

Exclusion total de deux pthread [et non de partie critique]


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut Exclusion total de deux pthread [et non de partie critique]
    bonjour tout le monde,

    Alors voilà. le but de mon programme est de simuler un monothread. Bien sur comme ce programme doit poller le réseau, il faut qu'une méthode s'active toutes les x secondes pour vérirfier si par hasard il n'y aurait pas de nouveau message.

    Sur les machines de distribution, je sais qu'il existe une sorte d'interruption que je peux rediriger vers une méthode. Cette interruption est appelé régulièrement. Je n'ai donc pas besoin de m'occuper de créer ce mécanisme.

    Sur mes machine de test, j'ai un linux tout à fait normal. J'utilise un pthread pour mon programme et un autre pour simuler l'interruption.

    Mon problème est le suivant.

    Si je veux simuler réellement ma machine de distribution il faut que je puisse m'assurer que lorsque mon thread interruption est réveiller, l'autre thread ne puisse pas revenir avant la fin du thread interruption.

    En gros je veux que mon thread interruption empêche le thread de mon programme de reprendre la main tant qu'il n'a pas fini.

    Bien sur j'ai tout de suite pensé au mutex. Mais comme mon programme peut être interrompu n'importe quand, il faudrait que je teste à chaque ligne si la variable mutex est libre. Ce qui est bien sur impensable.

    Ayant étudier quelques temps les pth (portable thread coté utilisateur) je me suis dit qu'une fonction suspend devait surement exister du coté des pthread. Que nenni me dit t on sur google...

    Je sais plus trop ou chercher...
    Est ce qu'il existe un moyen de faire de l'exclusion non pas de partie de code, mais de thread ou de transformer un thread non préemptif en préemptif...

    Si vous avez des idées, suggestions... Je les acceptes toutes... même et surtout si c'est pour me dire que c'est impossible... ca m'évitera de me casser la tête trop longtemps


    Merci d'avance

  2. #2
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    Je viens de trouver une nouvelle info et donc ca me mène à une question :

    - Qu'est ce qu'une priotrité pthread ?

    Si je défini une priorité super haute pour mon interruption est ce que par hasard ca pourrait correspondre à ce que je recherche ?
    Ou ca ne fera que déplacer le problème puisque seul le thread d'interruption sera utiliser... (a savoir que je fais un sleep dans le thread interruption j'imagine que tant qu'il sleep l'autre à le droit de faire quelque chose)

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 136
    Par défaut
    lu

    lorsque le thread interruption démarre, il peut envoyer un signal (pthread_kill) à l'autre thread pour lui demander de s'arrêter, et un autre lorsqu'il termine pour lui demander de continuer.

  4. #4
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    Citation Envoyé par sympho
    lu

    lorsque le thread interruption démarre, il peut envoyer un signal (pthread_kill) à l'autre thread pour lui demander de s'arrêter, et un autre lorsqu'il termine pour lui demander de continuer.
    euh... le pthread_kill ne détruit pas totalement le pthread ? je pensais que cette méthode était utilisé pour mettre fin violemment à un pthread...


    @Tchetch : ok je vais voir dans cette direction. j'y avais pas pensé. Ca pourrait répondre à mon problème en fait.

    @Emmanuel : Merci pour la précision, je vais voir la version de mon noyau et je ferais une recherche sur google pour savoir. (si je trouve quelque chose je le poste)

    Merci pour vos réponses.

    Une question reste en suspend... Comment sont utilisé les priorité de pthread ?

    Si j'ai un pthread avec une priorité plus haute, est ce qu'il l'execute jusqu'à ce qu'il soit fini ou il prend quand meme le temps de s'occuper des priorités plus basse ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ça dépend.
    Sous Windows, c'est la première solution au début, mais tout thread qui n'a pas été "servi" depuis plus de trois secondes est placé en priorité semi-maximale pour deux unités de temps, avant de retomber à sa priorité normale, pour éviter les famines...
    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.

  6. #6
    Membre confirmé Avatar de Thor Tillas
    Inscrit en
    Octobre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 113
    Par défaut
    ok alors pour ce que j'ai trouvé sur pthread_kill ca me parait correspondre à ce que je recherche.

    Mon seul soucis c'est comment je peux traiter le signal que je recois. L'envoyer est assez simple puisque je fais pthread_kill(progID,SIGUSR1) où progID est le pid de mon thread "programme".

    Par contre du coté du thread "programme" comment je fais pour dire, lorsque tu recois ce signal, tu fais ca. lorsque tu recois encore une fois ton signal tu fais ca.


    Je recherche en parrallèle sur google donc il se peut que je trouve la réponse tout seul mais si quelqu'un l'a sous la main, ca ira plus vite


    [EDIT] ca m'a pris moins de temps que prévu... donc euh.. signal() permet de définir un handler...
    Donc si je le défini au début de mon thread, chaque fois qu'il aura un signal du type voulu, il va appeler le handler.

    J'imagine donc que cette méthode n'est pas un wait sur un signal, mais une inscription à observateur d'evenement... Suis je sur la bonne voie ou je me trompe du tout au tout...

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Thor Tillas
    Est ce qu'il existe un moyen de faire de l'exclusion non pas de partie de code, mais de thread ou de transformer un thread non préemptif en préemptif...
    C'est une question de système. Les pthreads sous Windows XP sont préemptifs. Sous Linux, j'ai cru comprendre que ça dépendait du noyau (2.4, 2.6...) et de certains réglages...

  8. #8
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Je pense que tu devrais faire ça avec des signaux et deux processus. Un processus qui régulièrement lève un signal, par exemple SIGUSR1, pour simuler l'interruption générée sur ta machine de production et l'autre processus correspond on programme que tu veux tester. Ensuite tu n'aurais plus qu'à modifier ton programme pour qu'il utilise l'interruption de ta machine de production au lieu du signal.

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

Discussions similaires

  1. [Débutant] En ASP.NET, comment afficher un messagebox avec deux boutons OUI/NON?
    Par ronot dans le forum ASP.NET
    Réponses: 2
    Dernier message: 29/01/2013, 16h29
  2. deux boucles for non imbriquées
    Par ebenmous dans le forum Langage
    Réponses: 3
    Dernier message: 24/06/2011, 11h53
  3. charger deux images bitmap non visibles
    Par Madman dans le forum Visual Studio
    Réponses: 0
    Dernier message: 15/04/2010, 10h52
  4. SELECT classique + Total en 1 seule requête non-imbriquée
    Par thonglith dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/07/2008, 17h55
  5. Réponses: 9
    Dernier message: 12/10/2006, 00h36

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