【问题标题】:pthread_mutex_init result in Segmentation Faultpthread_mutex_init 导致分段错误
【发布时间】:2020-07-14 22:36:59
【问题描述】:

我是一名大学生,正在学习如何处理线程和数据库。 总体而言,我正在尝试创建一个将获取锁列表的函数,查看程序正在处理的当前锁是否在列表中,然后互斥锁锁定该锁。 目前,我在初始化 *locks 时遇到问题,但每次这样做时,都会出现分段错误(核心转储)。 我已经尝试使用不同的方式来初始化互斥锁: &locks->lock = PTHREAD_MUTEX_INITIALIZER; 以及使用:pthread_mutex_init(&locks->lock, NULL);

在.h文件中,它包含

typedef struct {
char *table;
pthrad_mutex_t lock;} TableLock;

主文件:

static pthread_mutex_t lock_on_locks;
static int active_tables = 0;
static TableLock *locks = NULL;

// Table locking functions
void sudba_lock(char *table) {
  sleep(2);
  if (locks == NULL) {
    my_realloc(locks, sizeof(TableLock));
    }
  pthread_mutex_lock(&lock_on_locks);
  char table_name[strlen(table) + 1];
  table_name[strlen(table)] = '\0';
  sprintf(table_name, "%s", table);
  if (active_tables == 0) {
    pthread_mutex_init(&locks->lock, NULL);
    pthread_mutex_lock(&locks->lock);
    locks[active_tables].table = table_name;
    active_tables++;
  }

my_realloc 函数是这样的:

void *my_realloc(void *ptr, size_t size) {
    void *result = malloc(size);
    if(!result) abort();
    return result
}

感谢任何帮助

【问题讨论】:

  • 关于:my_realloc(locks, sizeof(TableLock));TableLock是一个指针,所以sizeof(TableLock)会返回4或8的值(取决于底层硬件架构,代码需要跟踪当前'锁'的数量,并在调用之前将该数字加一:realloc()
  • 关于:if(!result) abort() 这会留下内存分配,导致内存泄漏。建议在退出前将(指向分配内存的指针)传递给free()。但是,每次调用 malloc() 时,参数 ptr 都不会被释放,因此每次调用该函数时,都会发生另一次内存泄漏
  • 关于:my_realloc(locks, sizeof(TableLock)); 函数:my_realloc() 返回指向刚刚分配的内存的指针,但返回的指针从未实际分配给变量locks
  • 关于:table_name[strlen(table)] = '\0'; 函数:strlen() 仅在 char 数组 table[] 已经为 NUL 终止时才有效。否则结果是未定义的行为。写入遇到 NUL 字节的任何位置都是引发段错误事件的好方法。
  • 请发minimal reproducible example,以便我们重现问题并帮助您调试。

标签: c database pthreads mutex


【解决方案1】:

您的崩溃与pthread_mutex_lock 无关;只是你传递了一个空指针给它,因为你没有保存realloc 的结果。你在哪里:

my_realloc(locks, sizeof(TableLock));

应该是:

locks = my_realloc(locks, sizeof(TableLock));

但我不清楚你为什么要分配它,因为这看起来像一个单实例锁。通常,锁要么具有静态存储持续时间,要么存在于您正在分配的某些结构中(它们将保护其内容)。自己分配单独的锁是一种代码味道。

除了崩溃之外,您的代码还有很多其他看起来有问题的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2020-12-31
    • 2019-07-21
    • 2018-07-28
    • 2014-04-25
    • 2011-07-18
    相关资源
    最近更新 更多