web-dev-qa-db-fra.com

Problèmes de référence non définis à l'aide de sémaphores

Je joue avec l'utilisation des sémaphores, mais je continue de rencontrer des avertissements de référence non définie, ce qui empêche mon code de fonctionner. J'ai extrait l'exemple de code d'un texte, mais rencontrais des problèmes avec une partie de leur syntaxe, alors je suis allé au didacticiel sur les sémaphores de POSIX et j'ai changé les choses pour leur syntaxe et, par conséquent, j'obtiens maintenant ces erreurs de référence.

Je suis peut-être simplement en train d'oublier quelque chose, mais je ne le trouve pas.

Les erreurs:

Producers_Consumers.c:52: warning: return type of ‘main’ is not ‘int’
/tmp/cceeOM6F.o: In function `producer':
Producers_Consumers.c:(.text+0x1e): undefined reference to `sem_init'
Producers_Consumers.c:(.text+0x3a): undefined reference to `sem_init'
Producers_Consumers.c:(.text+0x46): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x52): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x5e): undefined reference to `sem_post'
Producers_Consumers.c:(.text+0x6a): undefined reference to `sem_post'
/tmp/cceeOM6F.o: In function `consumer':
Producers_Consumers.c:(.text+0x7e): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x8a): undefined reference to `sem_wait'
Producers_Consumers.c:(.text+0x96): undefined reference to `sem_post'
Producers_Consumers.c:(.text+0xa2): undefined reference to `sem_post'
collect2: ld returned 1 exit status

Ce que j'ai (cela peut sembler un peu moche à cause de la façon dont j'ai commenté les choses de mon ancienne méthode) Je sais également que ma méthode d'ajout ne fonctionnera pas, mais j'y arriverai lorsque je corrigerai mes problèmes de syntaxe:

#include <stdio.h>
#include <semaphore.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

#define N 10     //Number of slots in buffer
typedef int semaphore;  //Semaphores ae a special kind of int
sem_t mutex; //Controls access to critical region 1
sem_t empty;  //Counts empty buffer slots N
sem_t  full;  //Counts full buffer slots 0
int count = 0; //What we're putting in 
//int buffer[N];

void producer(void) {
    sem_init(&mutex, 0, 1);
    //sem_init(&empty, 0, N);
    sem_init(&full, 0, 0);

    while(1) { 
        sem_wait(&empty);
        sem_wait(&mutex);
        //printf("Empy: %d\n",empty);
        //printf("Mutex: %d\n",mutex);
        //printf("Both Downs Ran\n");
        //buffer = buffer + 1;
        sem_post(&mutex);
        sem_post(&full);
        //printf("Producer produced: %d\n",buffer);
    }
}

void consumer(void) {
    while(1) { 
        sem_wait(&full);
        sem_wait(&mutex);
        //item = buffer;
        sem_post(&mutex);
        sem_post(&empty);
        //printf("Consumer consumed: %d/n",item);
    }
}

void main() {

}
11
TheFatness

Si vous êtes sur un système Linux, vous devrez compiler et lier avec le drapeau -pthread Pour lier la bibliothèque pthreads.

gcc -pthread Producers_Consumers.c

Comme l'a souligné Paul Griffiths, vous pouvez également utiliser -lrt, Qui est plus portable, et relie la bibliothèque POSIX Realtime Extensions

gcc Producers_Consumers.c -lrt

  • int main(void) pas void main()
  • typedef int semaphore Est incorrect, sem_t Doit être traité comme un type opaque, vous n'utilisez jamais ce typedef dans votre code de toute façon.
  • Un problème que je prévois est que votre code consumer utilise les sémaphores avant leur initialisation dans producer. Vous devez les initialiser dans votre main
18
Ryan Haining

Vous avez la même erreur dans ubuntu qt. Après avoir ajouté

LIBS + = -lpthread -lrt

au fichier project.pro tout bien compilé.

2
Alexey