MST

星途 面试题库

面试题:C语言多线程环境下结构体动态内存释放时机

在一个多线程的C语言程序中,有一个共享的结构体`SharedStruct`,其定义如下: ```c struct SharedStruct { int value; char *text; struct SharedStruct *next; }; ``` 多个线程可能会对该结构体进行动态内存分配和释放操作。请设计一个机制,确保在多线程环境下,`SharedStruct`结构体及其相关动态内存能够被正确释放,避免内存泄漏和竞态条件。阐述设计思路并给出关键代码片段。
42.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 互斥锁(Mutex):使用互斥锁来保护对SharedStruct结构体及其相关动态内存的访问。在对结构体进行任何操作(包括分配和释放内存)之前,获取互斥锁;操作完成后,释放互斥锁。这样可以防止多个线程同时访问和修改共享资源,避免竞态条件。
  2. 引用计数:为SharedStruct结构体添加一个引用计数成员,用于记录当前有多少个线程正在使用该结构体。当一个线程创建或引用该结构体时,引用计数加1;当一个线程不再需要该结构体时,引用计数减1。只有当引用计数为0时,才真正释放结构体及其相关动态内存。

关键代码片段

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// 定义共享结构体
struct SharedStruct {
    int value;
    char *text;
    struct SharedStruct *next;
    int ref_count; // 引用计数
};

// 定义互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 创建新的共享结构体
struct SharedStruct* createSharedStruct(int val, const char *txt) {
    struct SharedStruct *new_struct = (struct SharedStruct*)malloc(sizeof(struct SharedStruct));
    if (new_struct == NULL) {
        perror("malloc");
        return NULL;
    }
    new_struct->value = val;
    new_struct->text = strdup(txt);
    if (new_struct->text == NULL) {
        perror("strdup");
        free(new_struct);
        return NULL;
    }
    new_struct->next = NULL;
    new_struct->ref_count = 1; // 初始引用计数为1
    return new_struct;
}

// 增加引用计数
void incrementRefCount(struct SharedStruct *struct_ptr) {
    pthread_mutex_lock(&mutex);
    struct_ptr->ref_count++;
    pthread_mutex_unlock(&mutex);
}

// 减少引用计数并释放内存
void decrementRefCount(struct SharedStruct *struct_ptr) {
    pthread_mutex_lock(&mutex);
    struct_ptr->ref_count--;
    if (struct_ptr->ref_count == 0) {
        free(struct_ptr->text);
        free(struct_ptr);
    }
    pthread_mutex_unlock(&mutex);
}

在多线程中使用时,例如:

void* threadFunction(void* arg) {
    struct SharedStruct *shared = (struct SharedStruct*)arg;
    incrementRefCount(shared);
    // 线程对shared进行操作
    // ...
    decrementRefCount(shared);
    return NULL;
}

在程序结束时,别忘了销毁互斥锁:

int main() {
    // 创建共享结构体
    struct SharedStruct *shared = createSharedStruct(42, "Hello");

    // 创建线程
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, threadFunction, (void*)shared);
    pthread_create(&thread2, NULL, threadFunction, (void*)shared);

    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 最后释放共享结构体(如果引用计数为0,实际已经释放)
    decrementRefCount(shared);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}