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 :

[semaphore]2 sémaphore initialisé bloquant, 1 bloc l'autre pas


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Par défaut [semaphore]2 sémaphore initialisé bloquant, 1 bloc l'autre pas
    bonjour a tous,

    dans mon programme j'ai 2 sémaphore nommé. initialisé bloquer j'ai fait 2 thraid avec un sen_wait au début l'un le premier sémaphore et bloquet et pas le se second.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    sem_t *sema_login = NULL;
    sem_t *sema_exit = NULL;
    const char *sem_name_login = "loggeur.login";
    const char *sem_name_exit = "abcdefgh";
     
    bool quitte = true;
     
    void* threadLogin(void *p_tsoap)
    {
    cout << "la thread login est lance \n";
            for(;;)
            {
                    sem_wait(sema_login);
    cout << "la thread login est relache \n";
             }
    }
    void* threadExit(void *p_tsoap)
    {
            int rtc = 0;
            printf("in exit thread sema_exit ptr %p\n",sema_exit);
            printf("sem_wait rtc %d\n",(rtc=sem_wait(sema_exit)));
            if(errno == EINTR)
            { 
              printf("retry wait\n");
              sem_wait(sema_exit);
            }
            printf("sem_wait finished\n");
            quitte =false;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    //
    //
    int main(int argc,char *argv[]){
     
            //Creation  semaphore
            //
    std::cout << "init semaphore : " << sem_name_login << "\n";
            int     oflag = O_CREAT ;
            sema_login = sem_open(sem_name_login, oflag, 0660, 0);
            sema_exit = sem_open(sem_name_exit, oflag, 0660, 0);
            printf("sem_exit ptr %p\n",sema_exit);
            if(sema_exit == SEM_FAILED)
            {
                    cout << "error in exit semaphore initialization " << errno << "\n";
            }
    cout << "fin init des semaphore" << endl;
     
            struct soap v_soap;
            struct soap *v_tsoap;
            pthread_t thread1, thread2;
            pthread_t thread3;
     
            //lancement de la thread qui arrete le programme
            pthread_create(&thread3 , NULL , threadExit, (void*)v_tsoap);
            int rtc = pthread_detach(thread3);
     
             pthread_create(&thread2 , NULL , threadLogin , (void*)v_tsoap );
            rtc = pthread_detach(thread2);
     
            soap_end(&v_soap);
     
            while(1)
                    usleep(20);
            return(0);}
    afficher a l'ecran

    init semaphore : loggeur.login
    sem_exit ptr 0xb7eed000
    fin init des semaphore
    thread3 rtc = 0
    in exit thread sema_exit ptr 0xb7eed000
    sem_wait rtc -1
    retry wait

    la thread login est lance
    je comprend pas dans la thread threadLogin le sémaphore est bloquer directement et que dans la thraid threadExit il n'est pas bloquer directeur mais la 2 ème fois il est bloqué. pour quoi les 2 sémaphores ne fonctionne pas de le même manière?
    comment je pourrai rendre le code un peu plus correcte?

    merci d'avance

    lermit

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    si tu galères toujours :
    en pseudo code je pourrais t aider rapidement...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Par défaut
    pseudo code
    fonction thread 1
    boucle presque infini
    bloquer sémaphore 1
    traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(;;)
            {
                    sem_wait(sema_login);
                    ...
             }
    fonction thrad 2
    bloquer sémaphore 2
    traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sem_wait(sema_exit);
            if(errno == EINTR)
            {
              sem_wait(sema_exit);
            }
            ...
    main
    initialisation sémaphore 1 bloquer
    initialisation sémaphore 2 bloquer

    initialisation thread 1
    lancement thread 1

    initialisation thread2
    lancement thread 2
    le problème n'est pas que j'ai pas sur faire le pseudo code mais plutôt que 2 sémaphore initialisé de la même et utilisé de la même manier mais il ne réagisse pas de la même manier.

  4. #4
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    d'apres ton pseudo code: je vois que tes 2 thread utilise chaqun un semaphore differents.

    Est-ce que les semaphores se comporte differeament si tu lance que le thread 1 ou que le thread 2 ?

    Et quel est le comportement si tu les initialise (les semaphores) dans l autre sens ?

    Tente de decouvrir la logique en modulant les actions avec les semaphores...

    Je peux regarder plus longuement demain si tu es toujours dans la galère.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Par défaut
    ok je testerai sa demain matin j'arrête pour aujourd'hui
    je te dirai plus demain.
    merci encore

Discussions similaires

  1. Mon bloc ne prend pas la hauteur voulue
    Par PodBlake dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 12/05/2012, 16h16
  2. Réponses: 4
    Dernier message: 29/06/2010, 11h45
  3. Les background de blocs ne coincident pas .
    Par soundlord dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 17/04/2008, 14h01
  4. [VB6] mise en commentaire d'un bloc de code
    Par JuanDeLaPlaya dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 15h05
  5. Périphérique de bloc
    Par MAGNUM_HEAD dans le forum Administration système
    Réponses: 4
    Dernier message: 20/03/2003, 19h04

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