pthread_mutex_init 导致分段错误

pthread_mutex_init result in Segmentation Fault

我是一名大学生,正在学习如何处理线程和数据库。 总的来说,我正在尝试创建一个函数,该函数将获取一个锁列表,查看程序正在处理的当前锁是否在列表中,然后互斥锁定该锁。 目前,我在初始化 * 锁时遇到问题,但每次这样做时,我都会收到分段错误(核心转储)。 我已经尝试使用不同的方式来初始化互斥锁: &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)] = '[=12=]';
  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
}

感谢任何帮助

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

my_realloc(locks, sizeof(TableLock));

应该是:

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

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

您的代码还有很多其他问题,与崩溃无关。