非零堆的互斥断言错误
Mutex assertion error with non-zero heap
如果我分配内存,释放它,然后尝试分配一个互斥量并锁定它,我会收到消息 Assertion 'mutex->__data.__owner == 0'
。我不是并发或低级编程方面的专家,但这对我来说似乎很奇怪。
代码
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void nonzero_heap(){
void *ptrs[2];
ptrs[0] = malloc(16);
memset(ptrs[0], 0x80, 16);
ptrs[1] = malloc(32);
memset(ptrs[1], 0x80, 32);
free(ptrs[0]);
free(ptrs[1]);
}
int main(){
nonzero_heap();
pthread_mutex_t* mutex = malloc(sizeof(pthread_mutex_t));
pthread_mutex_lock(mutex);
return 0;
}
说明
我不太确定 nonzero_heap()
做了什么(我 copy/pasted 它)除了它用一些垃圾填充堆然后释放它这一事实。因此稍后当我分配互斥锁时,它可能会在同一个位置分配并且我得到这个错误。
对这种行为有解释吗?我缺少什么?
好的,解决方案很愚蠢。我只是没有初始化互斥量。我没有想到这一点的原因是上面的代码在 calloc()
下运行良好。我猜省略初始化会适得其反。
来自联机帮助页:
The pthread_mutex_init() function shall initialize the mutex
referenced by mutex with attributes specified by attr. If attr is
NULL, the default mutex attributes are used; the effect shall be the
same as passing the address of a default mutex attributes object. Upon
successful initialization, the state of the mutex becomes initialized
and unlocked.
所以在这种情况下:
int main(){
nonzero_heap();
pthread_mutex_t* mutex = malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(mutex, NULL); # NEW LINE
pthread_mutex_lock(mutex);
return 0;
}
如果我分配内存,释放它,然后尝试分配一个互斥量并锁定它,我会收到消息 Assertion 'mutex->__data.__owner == 0'
。我不是并发或低级编程方面的专家,但这对我来说似乎很奇怪。
代码
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void nonzero_heap(){
void *ptrs[2];
ptrs[0] = malloc(16);
memset(ptrs[0], 0x80, 16);
ptrs[1] = malloc(32);
memset(ptrs[1], 0x80, 32);
free(ptrs[0]);
free(ptrs[1]);
}
int main(){
nonzero_heap();
pthread_mutex_t* mutex = malloc(sizeof(pthread_mutex_t));
pthread_mutex_lock(mutex);
return 0;
}
说明
我不太确定 nonzero_heap()
做了什么(我 copy/pasted 它)除了它用一些垃圾填充堆然后释放它这一事实。因此稍后当我分配互斥锁时,它可能会在同一个位置分配并且我得到这个错误。
对这种行为有解释吗?我缺少什么?
好的,解决方案很愚蠢。我只是没有初始化互斥量。我没有想到这一点的原因是上面的代码在 calloc()
下运行良好。我猜省略初始化会适得其反。
来自联机帮助页:
The pthread_mutex_init() function shall initialize the mutex referenced by mutex with attributes specified by attr. If attr is NULL, the default mutex attributes are used; the effect shall be the same as passing the address of a default mutex attributes object. Upon successful initialization, the state of the mutex becomes initialized and unlocked.
所以在这种情况下:
int main(){
nonzero_heap();
pthread_mutex_t* mutex = malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(mutex, NULL); # NEW LINE
pthread_mutex_lock(mutex);
return 0;
}