PDA

View Full Version : Thread in Unix


pieric27
28-06-2007, 14:16
Questo è il codice datomi dal mio prof:

#include <stdio.h> /*printf, perror*/
#include <pthread.h> /*thread*/
#include <errno.h> /*per gli errori, perror*/
#include <stdlib.h> /*exit*/

/* thread1: stampa i TID del main thread e di due altri thread */

void *start_func(void *arg) /* funzione di avvio */
{
printf("%s", (char *)arg);
printf(" and my TID is: %d\n",(int)pthread_self());
}

int main(void)
{
int en;
pthread_t tid1, tid2;
char *msg1 = "Hello world, I am thread #1";
char *msg2 = "Hello world, I am thread #2";

printf("The launching process has PID:%d\n",(int)getpid());

printf("The main thread has TID:%d\n",(int)pthread_self());

//crea il 1°thread
if ((en = pthread_create(&tid1, NULL, start_func, msg1)!=0))
errno=en, perror("Pthread_create"), exit(1);

//crea il 2°thread
if ((en = pthread_create(&tid2, NULL, start_func, msg2)!=0))
errno=en, perror("Pthread_create2"), exit(2);

//attende per il 1° thread
if ((en = pthread_join(tid1, NULL)!=0))
errno=en, perror("Pthread_join"), exit(1);

//attende per il 2° thread
if ((en = pthread_join(tid2, NULL)!=0))
errno=en, perror("Pthread_join2"), exit(2);

return 0;

}
*************************************************************************
Quando lo compilo con cc -c thread1.c non mi dà errori, ma quando voglio creare l'eseguibile con cc -o thread1 thread1.o mi dice:
thread1.o: In function `main':
thread1.c.text+0x97): undefined reference to `pthread_create'
thread1.c.text+0xee): undefined reference to `pthread_create'
thread1.c.text+0x136): undefined reference to `pthread_join'
thread1.c.text+0x17e): undefined reference to `pthread_join'
collect2: ld returned 1 exit status

come posso farlo compilare correttamente?

andbin
28-06-2007, 14:35
Aggiungi nella fase di link l'opzione -lpthread

pieric27
28-06-2007, 14:37
ok!! funziona!! come mai si deve inserire questa opzione?

andbin
28-06-2007, 14:42
ok!! funziona!! come mai si deve inserire questa opzione?La libreria pthreads non fa parte della libreria standard del C. La stessa cosa varrebbe per qualunque altra libreria esterna/non standard. Devi specificare al linker di collegare gli oggetti del tuo programma con le librerie necessarie.

pieric27
28-06-2007, 14:49
a me a volte mi hanno dato problemi anche le stringhe, quindi per utilizzare lo stesso metodo devo scrivere -lstring in fase di compilazione giusto?

andbin
28-06-2007, 14:53
a me a volte mi hanno dato problemi anche le stringhe, quindi per utilizzare lo stesso metodo devo scrivere -lstring in fase di compilazione giusto?No. E comunque dovresti specificare quali problemi hai avuto con le stringhe.

In generale, l'opzione -lnome va a cercare nella/e directory dove si trovano le librerie un file denominato libnome.so oppure, se non c'è .so, con .a
Tutto qui.

pieric27
28-06-2007, 15:28
ok! grazie mille, se ho altri problemi riscrivo ciao!!!

pieric27
28-06-2007, 19:02
ora invece esercitandomi sulle code di messaggi in Linux mi dà un errore simile:
mycoda1.o: In function `main':
mycoda1.c:(.text+0xb2): undefined reference to `mq_open'
mycoda1.c:(.text+0xe5): undefined reference to `mq_getattr'
mycoda1.c:(.text+0x163): undefined reference to `mq_send'
mycoda1.c:(.text+0x19e): undefined reference to `mq_getattr'
mycoda1.c:(.text+0x1d9): undefined reference to `mq_close'
collect2: ld returned 1 exit status

andbin
28-06-2007, 19:48
ora invece esercitandomi sulle code di messaggi in Linux mi dà un errore simileNon le ho mai viste/usate queste funzioni. Da una veloce ricerca su internet mi risulta che siano nella libreria libmqueue. Quindi prova -lmqueue

pieric27
28-06-2007, 20:03
queste sulle code l'ho trovato ed è -lrt, ora mi serve quello per i semafori, se vedi ho aperto un'altra discussione in merito a ciò!!!