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));
但我不清楚您为什么要分配它,因为这看起来像一个单实例锁。通常,锁要么具有静态存储持续时间,要么存在于您正在分配的某些结构内(它们将保护其内容)。单独分配一个单独的锁本身就是一种代码味道。
您的代码还有很多其他问题,与崩溃无关。
我是一名大学生,正在学习如何处理线程和数据库。
总的来说,我正在尝试创建一个函数,该函数将获取一个锁列表,查看程序正在处理的当前锁是否在列表中,然后互斥锁定该锁。
目前,我在初始化 * 锁时遇到问题,但每次这样做时,我都会收到分段错误(核心转储)。
我已经尝试使用不同的方式来初始化互斥锁:
&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));
但我不清楚您为什么要分配它,因为这看起来像一个单实例锁。通常,锁要么具有静态存储持续时间,要么存在于您正在分配的某些结构内(它们将保护其内容)。单独分配一个单独的锁本身就是一种代码味道。
您的代码还有很多其他问题,与崩溃无关。