2013-03-23 2 views
2

Я пытаюсь запустить эту программу С помощью GCC -Wall -std = c99 hilo.c - ./a.out hilo.c, и я получаю сообщение об ошибке:создание потоков в C

hilo.c: In function ‘func’: 
hilo.c:6:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘pthread_t’ [-Wformat] 
hilo.c: In function ‘main’: 
hilo.c:14:3: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] 
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(void)’ 
hilo.c:15:3: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] 
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(void)’ 
hilo.c:24:3: warning: statement with no effect [-Wunused-value] 
/tmp/cchmI5wr.o: In function `main': 
hilo.c:(.text+0x52): undefined reference to `pthread_create' 
hilo.c:(.text+0x77): undefined reference to `pthread_create' 
hilo.c:(.text+0x97): undefined reference to `pthread_join' 
hilo.c:(.text+0xab): undefined reference to `pthread_join' 
collect2: ld returned 1 exit status 

Не знаю, что не так с кодом, поэтому, если кто-нибудь сможет мне помочь, это будет оценено.

Это код:

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

void func(void){ 

     printf("thread %d\n", pthread_self()); 
     pthread_exit(0); 

} 

    int main(void){ 

     pthread_t hilo1, hilo2; 

     pthread_create(&hilo1,NULL, func, NULL); 
     pthread_create(&hilo2,NULL, func, NULL); 

     printf("the main thread continues with its execution\n"); 

     pthread_join(hilo1,NULL); 
     pthread_join(hilo2, NULL); 

     printf("the main thread finished"); 

     scanf; 

    return(0); 

} 
+1

@MichaelBurr: Это неудачно, но я не хочу отмечать как дубликат, если в другом вопросе принят неверный ответ. –

+0

@ Dietrich: Слишком плохо, что нет никакого сообщества/модератора/любого переопределения для принятых ответов на SO (я думаю, можно утверждать, что количество голосов должно действовать как таковое). Нам еще предстоит выяснить, принят ли здесь правильный ответ. –

ответ

5

Вы не связаны библиотеку PTHREAD. Скомпилировать с:

gcc -Wall -std=c99 hilo.c -lpthread 
+0

Я также должен добавить, что это способ POSIX для связывания * любой * библиотеки (-l) в целом. Хотя в случае pthreads это случай зависимости от компилятора и libc, т. Е. Когда используется '-pthread', gcc устанавливает дополнительные параметры/переключатели, которые не могут быть установлены с помощью' -lpthread' (и могут даже привести к некорректному функционалу libc). Это сильно зависит от gcc. Более общий ответ: используйте '-pthread', когда это доступно. Если нет, используйте '-lpthread' * и * убедитесь, что вы установили любые другие параметры/компиляторы, необходимые для правильной работы вашей платформы/компилятора, прочитав ее документацию. –

7

Вы должны скомпилировать и связать с -pthread.

gcc -Wall -std=c99 hilo.c -pthread 

Недостаточно использовать -lpthread. Флаг -pthread изменит работу некоторых функций libc, чтобы они работали корректно в многопоточной среде.

+1

Ваш ответ зависит от платформы. На * some *, -pthread необходимо, хотя я подозреваю, что в этом случае вы правы. Это просто не то, что так происходит в каждой системе с поддержкой pthreads. –

2

Изменить

void func(void) 

в

void* func(void *) 

и компилировать с

gcc hilo.c -pthread 

Вы будете иметь только ошибки печати pthread_self(), потому что это не int.

Смежные вопросы