2017-03-02 1 views
0

Je suis en train de donner un sens à un programme:pthread_create de référence non définie

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <pthread.h> 

int main(int argc, char** argv) { 

volatile double fShared = 0.0; 
// create pthread structures - one for each thread 
pthread_t t0; 
pthread_t t1; 
//Arbitrary pointer variables - void* is a pointer to anything 
void *thread_res0; 
void *thread_res1; 
int res0,res1; 
//create a new thread AND run each function 
// we pass the ADDRESS of the thread structure as the first argument 
// we pass a function name as the third argument - this is known as a FUNCTION pointer 
// you might want to look at the man pages for pthread_create 
res0 = pthread_create(&t0, NULL, do_this, (void*)""); 
res1 = pthread_create(&t1, NULL, do_that, (void*)""); 
// Two threads are now running independently of each other and this main function 
// the function main is said to run in the main thread, so we are actually running 

// The main code can now continue while the threads run - so we can simply block 
res0 = pthread_join(t0, &thread_res0); 
res1 = pthread_join(t1, &thread_res1); 

printf ("\n\nFinal result is fShared = %f\n",fShared); 
return (EXIT_SUCCESS); 
} 

Il convient de noter que do_this et do_that sont des fonctions créées plus tôt dans le programme. Je reçois les erreurs suivantes:

[email protected]:~/Programs$ Homework2OS.c 
/tmp/cceiRtg8.O: in function 'main' 
Undefined reference to 'pthread_create' 
Undefined reference to 'pthread_create' 
Undefined reference to 'pthread_join' 
Undefined reference to 'pthread_join' 

Nous avons reçu ce bit de code à corriger. J'ai trouvé ailleurs le format pour le constructeur pthread_create. Ai-je besoin de le définir au-dessus du principal? J'avais l'impression qu'il était importé avec la bibliothèque.

Je me risquerais aussi à deviner que cela a quelque chose à voir avec le quatrième paramètre? Je comprends que le premier paramètre est l'emplacement du thread (défini ci-dessus), le second est NULLed, le troisième est l'appel de la fonction, mais je ne comprends pas très bien ce que le quatrième paramètre est censé être.

Qu'est-ce qui ne va pas?

+0

Montrez votre commande de compilation, et votre '# directives include'. Lisez quelques [tutoriel pthread] (https://computing.llnl.gov/tutorials/pthreads/). Quel est votre système d'exploitation? Lisez [pthread_create (3)] (http://man7.org/linux/man-pages/man3/pthread_create.3.html) –

+1

passez l'option '-lpthread' à votre compilateur – StoryTeller

+3

En fait vous devriez passer' -pthread' à votre compilateur 'gcc', puis la bibliothèque' -lpthread' serait liée –

Répondre

0

toutes les importations de code est l'en-tête de la bibliothèque pthread. (Pthread.h)

Ce qui manque est l'éditeur de liens doit inclure effectivement la bibliothèque pour gcc le paramètre -pthread est nécessaire (à la fin de la liste des paramètres à gcc.)

Il doit être à la fin car l'éditeur de liens traite les paramètres dans l'ordre indiqué sur la ligne de commande et si les fichiers objets ne sont pas déjà traités, il n'y aura aucune référence non résolue pour que l'éditeur de liens tente de résoudre via la bibliothèque pthread.

I.E. cela est faux:

gcc -g -o myprogram -lpthread myprogram.o 

Ceci est correct:

gcc -g -o myprogram myprogram.o -lpthread