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.

Share:
22,688
user2188946
Author by

user2188946

Updated on October 30, 2020

Comments

  • user2188946
    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
    Randy Howard about 11 years
    Your 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
    P.P over 9 years
    I 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.