面试题答案
一键面试实现思路
- 结构体设计:使用C语言的位域特性定义一个结构体,来精确映射寄存器的各个位。
- 更新函数:为每个需要更新的位域编写一个函数,这些函数负责根据输入参数更新结构体中相应的位域值。
- 线程安全:使用互斥锁(mutex)来保证在多线程环境下对结构体的操作是线程安全的。在进入更新函数时获取锁,操作完成后释放锁。
关键代码
#include <stdio.h>
#include <pthread.h>
// 定义结构体映射寄存器位域
typedef struct {
unsigned int run_mode : 4; // 第0 - 3位控制运行模式
unsigned int priority : 3; // 第4 - 6位设置优先级
unsigned int special_func : 1; // 第7位开启或关闭特殊功能
} RegisterStruct;
// 定义互斥锁
pthread_mutex_t mutex;
// 初始化结构体
void initRegister(RegisterStruct *reg) {
reg->run_mode = 0;
reg->priority = 0;
reg->special_func = 0;
}
// 更新运行模式的函数
void updateRunMode(RegisterStruct *reg, unsigned int mode) {
pthread_mutex_lock(&mutex);
if (mode < 4) {
reg->run_mode = mode;
}
pthread_mutex_unlock(&mutex);
}
// 更新优先级的函数
void updatePriority(RegisterStruct *reg, unsigned int pri) {
pthread_mutex_lock(&mutex);
if (pri < 8) {
reg->priority = pri;
}
pthread_mutex_unlock(&mutex);
}
// 更新特殊功能的函数
void updateSpecialFunc(RegisterStruct *reg, unsigned int func) {
pthread_mutex_lock(&mutex);
if (func < 2) {
reg->special_func = func;
}
pthread_mutex_unlock(&mutex);
}
// 打印结构体内容的函数
void printRegister(RegisterStruct *reg) {
pthread_mutex_lock(&mutex);
printf("Run Mode: %u, Priority: %u, Special Func: %u\n", reg->run_mode, reg->priority, reg->special_func);
pthread_mutex_unlock(&mutex);
}
// 模拟线程函数
void* threadFunction(void* arg) {
RegisterStruct *reg = (RegisterStruct*)arg;
updateRunMode(reg, 2);
updatePriority(reg, 5);
updateSpecialFunc(reg, 1);
printRegister(reg);
return NULL;
}
int main() {
RegisterStruct reg;
pthread_t threads[2];
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
// 初始化寄存器结构体
initRegister(®);
// 创建线程
for (int i = 0; i < 2; i++) {
pthread_create(&threads[i], NULL, threadFunction, ®);
}
// 等待线程结束
for (int i = 0; i < 2; i++) {
pthread_join(threads[i], NULL);
}
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
上述代码定义了一个结构体来映射寄存器的位域,并提供了更新和打印结构体内容的函数。通过互斥锁保证了多线程环境下对结构体的安全操作。