面试题答案
一键面试设计思路
- 互斥锁(Mutex):使用互斥锁来保护对
SharedStruct
结构体及其相关动态内存的访问。在对结构体进行任何操作(包括分配和释放内存)之前,获取互斥锁;操作完成后,释放互斥锁。这样可以防止多个线程同时访问和修改共享资源,避免竞态条件。 - 引用计数:为
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;
}