具有非零堆的互斥锁断言错误

时间:2015-03-09 18:10:06

标签: c pthreads mutex heap-memory memset

如果我分配内存,释放它然后尝试分配互斥锁并锁定它,我收到消息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()做什么(我复制/粘贴它),除了它用垃圾堆填充堆然后释放它。因此,稍后当我分配互斥锁时,它可能会在同一位置分配,我会收到此错误。

这种行为有解释吗?我错过了什么?

1 个答案:

答案 0 :(得分:3)

好的,解决方案很愚蠢。我只是没有初始化互斥锁。我没想到的原因是上面的代码与calloc()一起工作正常。我猜想省略初始化会在你最不期望的时候适得其反。

从联机帮助页:

  

pthread_mutex_init()函数应初始化互斥锁   由互斥体引用,由attr指定的属性引用。如果attr是   NULL,使用默认的互斥锁属性;效果应该是   与传递默认互斥锁属性对象的地址相同。上   成功初始化后,互斥锁的状态变为初始化状态   并解锁。

所以在这种情况下:

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;
}