c - 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
}
任何帮助表示赞赏
解决方案
你的崩溃与它无关pthread_mutex_lock
;只是您将空指针传递给它,因为您没有保存realloc
. 你在哪里:
my_realloc(locks, sizeof(TableLock));
它应该是:
locks = my_realloc(locks, sizeof(TableLock));
但我不清楚你为什么要分配它,因为这看起来像一个单实例锁。通常锁要么具有静态存储持续时间,要么存在于您正在分配的某些结构中(它们将保护其内容)。自己分配一个单独的锁是一种代码味道。
与崩溃无关,您的代码还有很多其他看起来有问题的地方。
推荐阅读
- wordpress - 具有 3 个类别的类别过滤器
- rhel - SAN 上的 Postgres
- javascript - 如何使用自定义文件列表(远程、服务器目录)在 SPA(浏览器端)上打开文件对话框
- batch-file - Windows 批处理脚本 ping 一小时
- python-3.x - 使用 Spacy 创建 FAQ 机器人的过程是什么?
- php - PHP在浏览器中显示带有readfile 2个单独文件
- java - 春季无法将pdf文件转换为字节[]
- c# - 通过 .Net Core 2.2、Azure Functions 对具有多种实现的装饰器模式进行依赖注入
- python - 从另一个进程启动一个进程的问题
- selenium - 如何在浏览器中获取 REAL 源代码?