由于此等式末尾的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;
}
答案 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()
中解除分配堆栈。