首页 > 解决方案 > pthread_mutex_init 导致分段错误

问题描述

我是一名大学生,正在学习如何处理线程和数据库。总的来说,我正在尝试创建一个函数来获取锁列表,查看程序正在处理的当前锁是否在列表中,然后互斥锁锁定该锁。目前,我在初始化 *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
}

任何帮助表示赞赏

标签: cdatabasepthreadsmutex

解决方案


你的崩溃与它无关pthread_mutex_lock;只是您将空指针传递给它,因为您没有保存realloc. 你在哪里:

my_realloc(locks, sizeof(TableLock));

它应该是:

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

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

与崩溃无关,您的代码还有很多其他看起来有问题的地方。


推荐阅读