Ошибка сегмента с аргументом 4 функции pthread_create () - PullRequest
4 голосов
/ 27 октября 2011

При попытке запустить этот код я получил сообщение об ошибке сегментации (дамп ядра).Примечание: это действительно длинная программа (почти 600 строк), поэтому я разместил только те, которые, как мне кажется, связаны между собой.Дайте мне знать, если нужно больше?Заранее спасибо:)

#define CONSTANT 4

int main()
{
  pthread_t tid[CONSTANT];
  int i, check;
  for( i = 0; i < CONSTANT; i++ )
  {
     check = pthread_create( &tid[i], NULL, tFunction, (void *) CONSTANT );
  }
}

void * tFunction ( void * param )
{
  int num = * (int *) param;  /* Seg fault line */
}

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Если вы собираетесь привести константу к void * и передать ее в качестве параметра контекста, вам нужно выполнить дополнительную операцию на другом конце:

int num = (intptr_t)param;

Должен сделать это за вас. Ваша текущая программа имеет дополнительную разыменовку, которая в итоге делает что-то вроде этого:

int num = *(int *)4;

и вот что сейчас приводит к сбою вашей программы.

2 голосов
/ 27 октября 2011

То, что вы делаете:

check = pthread_create( &tid[i], NULL, tFunction,(void *) 4);

И трактуете 4-й аргумент как int *, которыйочевидно нет.Когда вы разыменовываете адрес 4 в tFunction, вы получаете segfault.

Если вы хотите передать указатель на int со значением 4, передайте адресint переменная, то есть:

#include <pthread.h>

#define CONSTANT 4

void * tFunction ( void * param )
{
  int num = * (int *) param;  /* Seg fault line */
}

int main(void)
{
  int arg = CONSTANT;
  pthread_t tid[CONSTANT];
  int i, check;
  for( i = 0; i < CONSTANT; i++ )
  {
     check = pthread_create( &tid[i], NULL, tFunction, (void *) &arg );
  }

  return 0;
}

РЕДАКТИРОВАТЬ : pthread_join будет полезна, так что вы можете дождаться завершения ваших потоков перед выходом из вашей программы.

EDIT2 : Если вы не читали комментарии: вы должны убедиться, что передаете локальную переменную (как в этом примере, который должен был показать очень незначительные изменения в его коде, чтобы получить его).что все новые потоки заканчивают работу до того, как переменная выходит из области видимости с помощью pthread_join, или для динамического выделения памяти для переменной в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...