【发布时间】:2020-07-14 22:36:59
【问题描述】:
我是一名大学生,正在学习如何处理线程和数据库。
总体而言,我正在尝试创建一个将获取锁列表的函数,查看程序正在处理的当前锁是否在列表中,然后互斥锁锁定该锁。
目前,我在初始化 *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
}
感谢任何帮助
【问题讨论】:
-
关于:
my_realloc(locks, sizeof(TableLock));TableLock是一个指针,所以sizeof(TableLock)会返回4或8的值(取决于底层硬件架构,代码需要跟踪当前'锁'的数量,并在调用之前将该数字加一:realloc()。 -
关于:
if(!result) abort()这会留下内存分配,导致内存泄漏。建议在退出前将(指向分配内存的指针)传递给free()。但是,每次调用malloc()时,参数ptr都不会被释放,因此每次调用该函数时,都会发生另一次内存泄漏 -
关于:
my_realloc(locks, sizeof(TableLock));函数:my_realloc()返回指向刚刚分配的内存的指针,但返回的指针从未实际分配给变量locks -
关于:
table_name[strlen(table)] = '\0';函数:strlen()仅在 char 数组table[]已经为 NUL 终止时才有效。否则结果是未定义的行为。写入遇到 NUL 字节的任何位置都是引发段错误事件的好方法。 -
请发minimal reproducible example,以便我们重现问题并帮助您调试。