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 :

Initiation aux sémaphores


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Initiation aux sémaphores
    Bonjour,

    Essayant de comprendre les sémaphores, je me suis lancé un défit : tenter d'avoir à l'affichage : A B A B A B A ... et ensuite tenter d'obtenir A B B A B B A ...

    Seulement, je n'y arrive absolument pas. Voici les différents codes sources :

    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
     
        int nbsem = 1;
        int clef = 888;
     
        int id = semget(clef, nbsem, 0777 | IPC_CREAT);
        if(id == -1) {
            cout << "Erreur lors de la création des sémaphores" << endl; 
            exit(1);
        }
     
        semun s; 
        ushort * t = new ushort[nbsem];
        t[0] = 1; 
        t[1] = 0; 
        s.array = t;
        int ret = semctl(id, nbsem, SETVAL, s);
    Normalement, ce programme crée deux sémaphores avec comme valeurs respectives : 1 et 0.

    Ensuite dans le programme A, j'effectue :

    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
     
        int clef = 88;
     
        int id = semget(clef, 2, 0666); // récupérer les deux sémaphores (2)
        if(id == -1) {
            cout << "Erreur lors de la lecture du sémaphore" << endl; 
            exit(99);
        }
     
        struct sembuf bufferP;
        struct sembuf bufferV; 
        while(true) { 
            bufferP.sem_num = 0; 
            bufferP.sem_op = -1; 
            bufferP.sem_flg = 0; 
            semop(id, &bufferP , 1);
     
            // Attachement de la sémaphore au processus
            int id, ret; 
     
            // Arret du programme pendant une seconde.
            sleep(1);
     
            // Affichage du message. 
            cout << "Programme A (pid : " << getpid() << ") : " << nb  << "s" << endl;
     
            // V(B)
            bufferV.sem_num = 1;
            bufferV.sem_op = 1;
            bufferV.sem_flg = 0;
            semop(id, &bufferV, 1);
        }    
        return 0;
    Le code B est le même en inversant les sem_num.
    Seulement je lance le code de cette façon : ./A && ./B et là j'obtiens A B A B A B et en effectuant l'inverse (après avoir réinitialisé les sémaphores), j'obtiens : ./B && ./A ... B A B A B A. Donc si vous voyez d'où vient l'erreur, je veux bien un correctif.

    Et normalement, le programme B ne devrait pas être lançable …*Mais lorsque je fais ./B, il se lance …

    Merci beaucoup !

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je ne peux t'aider pour ton problème, mais j'ai une remarque.

    Ton code est ce que l'on appelle du "C/C++". C'est un langage imaginaire.
    Ton code reprend exactement la syntaxe du C, mais utilise simplement les flux du C++.

    Par exemple, en C, lorsque l'on instancie un objet qui est de type MaStructure, il faut préfixer le type par struct. En C++, ce n'est plus nécessaire.

    Je te conseille donc d'adapter ton code à la syntaxe normalisée du C++ ou bien de le passer à la syntaxe normalisée du C.

Discussions similaires

  1. initiation aux GUI
    Par rakinetak dans le forum Interfaces Graphiques
    Réponses: 19
    Dernier message: 04/08/2008, 10h17
  2. Initiation aux bases de données
    Par csadda dans le forum Débuter
    Réponses: 6
    Dernier message: 02/05/2008, 18h54
  3. [Aide][Delphi 7] Initiation aux WEB Services
    Par diden138 dans le forum Delphi
    Réponses: 9
    Dernier message: 25/02/2007, 20h21
  4. initiation aux Accelerators MFC
    Par giova_fr dans le forum MFC
    Réponses: 2
    Dernier message: 05/09/2005, 12h01

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