繁体   English   中英

非零堆的互斥声明错误

[英]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()做什么(我将其复制/粘贴),除了它会用一些垃圾填充堆然后释放它外。 因此,稍后在分配互斥锁时,它可能在同一位置被分配,并且出现此错误。

有这种行为的解释吗? 我缺少什么?

好,解决方案很愚蠢。 我只是没有初始化互斥锁。 我不认为这是因为上面的代码可以与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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM