【问题标题】:Mutex assertion error with non-zero heap非零堆的互斥断言错误
【发布时间】:2015-03-09 18:10:06
【问题描述】:

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

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

【问题讨论】:

  • 在尝试更改受保护的数据之前,您是否致电pthread_mutex_unlockmutex 只在main() 的范围内定义,就像你写的那样。
  • @ryyker 嘿,我实际上在最后一分钟解决了这个问题。我只是忘了初始化..

标签: c pthreads mutex heap-memory memset


【解决方案1】:

好的,解决方案很愚蠢。我只是没有初始化互斥锁。我没有想到这一点的原因是上面的代码在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;
}

【讨论】:

  • 是的,这与我在不同的 C 支持库中使用的协议非常相似。
猜你喜欢
  • 2010-11-09
  • 1970-01-01
  • 2017-11-21
  • 2022-01-01
  • 1970-01-01
  • 2012-10-14
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多