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故障事件的好方法。请发布一条消息,以便我们重现问题并帮助您调试它们。