Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthread_mutex_init导致分段错误_C_Database_Pthreads_Mutex - Fatal编程技术网

C pthread_mutex_init导致分段错误

C pthread_mutex_init导致分段错误,c,database,pthreads,mutex,C,Database,Pthreads,Mutex,我是一名大学生,正在学习如何处理线程和数据库。 总的来说,我试图创建一个函数,它将获取一个锁列表,查看程序正在处理的当前锁是否在列表中,以及互斥锁是否在该锁中。 目前,我在初始化*锁时遇到问题,但每次我这样做时,都会出现分段错误(核心转储)。 我已经尝试使用不同的方法初始化互斥锁: &locks->lock=PTHREAD\u MUTEX\u初始值设定项 以及使用:pthread\u mutex\u init(&locks->lock,NULL) 在.h文件中,它包含 typedef struc

我是一名大学生,正在学习如何处理线程和数据库。 总的来说,我试图创建一个函数,它将获取一个锁列表,查看程序正在处理的当前锁是否在列表中,以及互斥锁是否在该锁中。 目前,我在初始化*锁时遇到问题,但每次我这样做时,都会出现分段错误(核心转储)。 我已经尝试使用不同的方法初始化互斥锁:
&locks->lock=PTHREAD\u MUTEX\u初始值设定项
以及使用:
pthread\u mutex\u 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
}

非常感谢您的帮助

您的崩溃与
pthread\u mutex\u lock
无关;只是因为没有保存
realloc
的结果,所以向它传递了一个空指针。如果您有:

my_realloc(locks, sizeof(TableLock));
应该是:

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


与崩溃无关,您的代码也有许多其他问题看起来是错误的。

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