Home > Mobile >  Simple pthread prog: segmentation fault
Simple pthread prog: segmentation fault

Time:12-01

Trying to see how pthread works by running a simple program but I am getting segmentation fault (core dumped) at pthread_create

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

void* testfunc(void* arg) {
  while (1) {
    printf("testfunc");
  }
}

int main(void) {
  printf("helo\n");

  if (pthread_create(NULL, NULL, &testfunc, NULL) != 0) {
    perror("pthread failed to create\n");
  }

  while (1) {
    printf("main function\n");
    sleep(1000);
  } 

  return 0;
}

What seems to be causing the problem? I am on Ubuntu 20.04 if that matters.

CodePudding user response:

You can't pass NULL for pthread_create's first argument.

Before returning, a successful call to pthread_create() stores the ID of the new thread in the buffer pointed to by thread

Also, pthread_create doesn't set errno, so using perror makes no sense, at least not without some prep.

on error, it returns an error number, and the contents of *thread are undefined.

Fixed:

pthread_t thread;
if ( ( errno = pthread_create(&thread, NULL, &testfunc, NULL) ) != 0 ) {
    perror("pthread failed to create\n");
}

...

pthread_join(thread, ...);  // Normally.

CodePudding user response:

Threads in c are very unforgiving. There are a few problems with your code that I can see.

First you might want to refer to the developer docs for p_thread. They are very well documented. What you currently have is a thread call but you are not pointing anything to that thread. This is why you are receiving the segmentation error. Meaning your program lost the pointer to that thread somewhere when it tried calling it. I suggest something like.

pthread_t thread;
int * argument = 5;
if(pthread_create(&thread,NULL, &testfunc, &argument) !=0){
//                                        ^This is a pointer to your argument 
//                                         that you want to pass in
   perror("pthread failed to create\n");
   exit(1);
}

and your thread function will also need to be typecast from a void pointer into whatever you want it to return to work with. Then it needs to be cast back to a void pointer before is returned from the thread routine.

void* testfunc(void* arg){
  int* testVar = (int *)arg;

  // do some logic here

  return (void *) testVar;
}

lastly you are responsible for your memory in C so you must kill the thread you created before exiting.

pthread_join(thread, NULL);

My number one suggestion is you watch some videos relating to it.

  • Related