0

この式の最後にある 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;
}
4

1 に答える 1

0

編集:あなたは質問を完全に変更したので、私の古い答えはもう意味がありません。私は新しい質問に答えようとします(古い回答はまだ下にあります)が、参考までに、次回は古い質問を変更するのではなく、新しい質問をしてください。

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.

同じメモリを 2 回解放します。

-- 古い答え

プッシュでは、と同じメモリ ブロックstckを指すように設定し、呼び出しの最後にスタックを解放します (したがって、各スレッドから共通スタックで free() を 1 回呼び出します)。_stck

呼び出しを削除するfree()と、少なくとも私にとっては、もうクラッシュしません。スタックの割り当て解除は、おそらくmain()すべてのスレッドに参加した後に行う必要があります。

于 2012-01-29T10:03:23.567 に答える