Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C - pthread_join() hangs (sometimes)

Hi fellow programmers,

I wanted to write a simple multi-threaded program in C with pthread, but somehow the pthread_join seems to hang. It seems happens not always, sometimes everything is running fine, next time it't hanging againg, usually on the first thread.

I already minimized the code to the bare minimum, so that i can exclude other problems. In the full code the threads did some computations, of course. But the problems still persists even with this very reduced code. And on more than one machine, with different OS'es.

strace shows me that the hanging has something to do with a FUTEX_WAIT, the full last lines:

write(1, "Joining Thread 0...\n", 20Joining Thread 0...
)   = 20
futex(0x7fff61718a20, FUTEX_WAIT, 1634835878, NULL

I tried to debug it with gdb, but my poor debugging stills are very limited, especially with multi-threaded programs. I also tried to compile it using different C-standards (C99 and Ansi) and both pthread parameters (-lpthread, -pthread), but the problem still persists.

The (reduced) code monte2.c:

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

void *monte(struct MonteArgs *args) {
  pthread_exit(NULL);
}

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

  int numThreads, numSamples;
  int i;

  if (argc != 3) {
    printf("Usage: monte threads samples\n");
    exit(1);
  }

  numThreads = atoi(argv[1]);
  pthread_t threads[numThreads];
  numSamples = atoi(argv[2]);

  for (i=0; i<numThreads; i++) {
    if (pthread_create(&threads[i], NULL, monte, NULL)) {
      printf("Error Creating Thread %d!\n", i);
      return 1;
    }
  }

  for (i=0; i<numThreads; i++){
    printf("Joining Thread %d...\n", i);
    pthread_join(&threads[i], NULL);
  }

  printf("End!\n");
  fflush(stdout);
  return(0);
}

I compile with

gcc monte2.c -lpthread -o monte

and run with

./monte2 3 100

where the first argument is the number of threads, and the second is actually not needed for the reduced code.

like image 454
juks Avatar asked Sep 10 '25 13:09

juks


1 Answers

It's been a while since I've done multi-threaded C, but you shouldn't ignore compiler warnings :-). Compile with -Wall.

You should be seeing a warning like this:

note: expected 'pthread_t' but argument is of type 'pthread_t *'
int       WINPTHREAD_API pthread_join(pthread_t t, void **res);

You are passing a pthread_t* when you should be passing pthread_t.

Refer to the pthread_join docs: http://man7.org/linux/man-pages/man3/pthread_join.3.html

like image 86
Christopher Schneider Avatar answered Sep 13 '25 03:09

Christopher Schneider