creating threads in C
22,688
Solution 1
You should compile and link with -pthread
.
gcc -Wall -std=c99 hilo.c -pthread
It is not sufficient to use -lpthread
. The -pthread
flag will change how some libc functions work, in order to make them work correctly in a multithreaded environment.
Solution 2
You haven't linked the pthread library. Compile with:
gcc -Wall -std=c99 hilo.c -lpthread
Solution 3
Change
void func(void)
to
void* func(void *)
and compile with
gcc hilo.c -pthread
You will only have errors in printing pthread_self()
because it is not an int
.
Author by
user2188946
Updated on October 30, 2020Comments
-
user2188946 over 3 years
I am trying to run this C program using gcc -Wall -std=c99 hilo.c - ./a.out hilo.c and I am getting this error message:
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
No idea what's wrong with the code so if anyone could help me would be it would be appreciated.
This is the code:
#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); }
-
Randy Howard about 11 yearsYour answer depends upon the platform. On some, -pthread is necessary, even though I suspect in this case you are correct. It's just not a given that it is that way on every system with pthreads support.
-
P.P over 9 yearsI should also add that this is a POSIX way to link any library (-l) in general. While in case of pthreads, it's a case of compiler and libc dependent i.e. when
-pthread
is used gcc sets additional options/switches which may not be set with-lpthread
(and could even lead to incorrect functoning of libc). This is heavily gcc specific. The more general answer is: use-pthread
whenever available. If not, use-lpthread
and make sure you set any other options/compiler switches necessary for your platform/compiler's correct functioning by reading it's documentation.