Ошибка сегментации с несколькими потоками - PullRequest
0 голосов
/ 29 января 2012

Я получаю ошибку сегментации ошибки из-за free () в конце этого уравнения ...

мне не нужно освобождать временную переменную * stck? Или, так как это локальный указатель и Никогда не было выделено пространство памяти через malloc, компилятор очищает его для меня?

void * push(void * _stck)
{

  stack * stck = (stack*)_stck;//temp stack
  int task_per_thread = 0; //number of push per thread


  pthread_mutex_lock(stck->mutex);
  while(stck->head == MAX_STACK -1 )
  {
    pthread_cond_wait(stck->has_space,stck->mutex);
  }

  while(task_per_thread <= (MAX_STACK/MAX_THREADS)&&
        (stck->head < MAX_STACK) &&
    (stck->item < MAX_STACK)//this is the amount of pushes
                //we want to execute
       )
  { //store actual value into stack
    stck->list[stck->head]=stck->item+1;
    stck->head = stck->head + 1;
    stck->item = stck->item + 1; 
    task_per_thread = task_per_thread+1; 
  }

  pthread_mutex_unlock(stck->mutex);


  pthread_cond_signal(stck->has_element);


  free(stck);


  return NULL;
}

1 Ответ

0 голосов
/ 29 января 2012

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

stck - это указатель, который вы указываете на ту же память, на которую указывает _stck. Указатель не подразумевает выделение памяти, он просто указывает на память, которая (как мы надеемся) уже выделена. Когда вы делаете, например,

char* a = malloc(10);  // Allocate memory and save the pointer in a.
char* b = a;           // Just make b point to the same memory block too.
free(a);               // Free the malloc'd memory block.
free(b);               // Free the same memory block again.

вы освобождаете одну и ту же память дважды.

- старый ответ

В режиме push вы устанавливаете stck так, чтобы он указывал на тот же блок памяти, что и _stck, и в конце вызова вы освобождаете стек (таким образом вызывая free () для вашего общего стек один раз из каждого потока)

Удалите вызов free(), и, по крайней мере для меня, он больше не будет падать. Распределение стека, вероятно, следует выполнить в main() после объединения всех потоков.

...