多线程分段故障

时间:2012-01-29 09:44:21

标签: multithreading multiprocess

由于此等式末尾的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 :(得分: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.

你释放相同的内存两次。

- 旧回答

在推送中,您将stck设置为指向_stck 相同的内存块,并在通话结束时释放堆栈(从而免费呼叫) ()在每个线程的公共堆栈上一次)

删除free()电话,至少对我而言,它不会再崩溃。在加入所有线程之后,应该在main()中解除分配堆栈。