面试题答案
一键面试实现思路
- 数据结构设计:
- 为每个异步I/O操作相关的数据结构中添加一个状态标识,用于表明该数据是否正在被处理。例如,若处理文件I/O,在文件描述符相关的数据结构中添加这样的标识。
- 设计一个共享的数据区来存储所有异步I/O操作可能会共同访问的数据,如全局的配置信息等。
- 操作流程:
- 在进行异步I/O操作前,先检查相关数据的状态。若数据正在被其他操作处理,则等待。
- 当异步I/O操作完成后,更新数据状态,通知其他等待的操作。
使用互斥锁实现并发控制
- 初始化互斥锁:
在程序开始处,使用
pthread_mutex_init
函数初始化互斥锁。例如:
#include <pthread.h>
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
- 加锁与解锁:
在访问共享数据或执行可能导致资源竞争的代码段前,使用
pthread_mutex_lock
加锁。例如:
pthread_mutex_lock(&mutex);
// 访问共享数据的代码,如读取或修改全局配置信息
pthread_mutex_unlock(&mutex);
这样,同一时间只有一个线程能够进入加锁的代码段,从而避免资源竞争,保证数据一致性。
使用信号量实现并发控制
- 初始化信号量:
使用
sem_init
函数初始化信号量。例如,初始化一个值为1的信号量,表示同一时间只允许一个操作访问共享资源:
#include <semaphore.h>
sem_t sem;
sem_init(&sem, 0, 1);
- 获取与释放信号量:
在访问共享数据前,使用
sem_wait
获取信号量。例如:
sem_wait(&sem);
// 访问共享数据的代码
sem_post(&sem);
sem_wait
会检查信号量的值,若值大于0,则将其减1并继续执行;若值为0,则阻塞等待。sem_post
会将信号量的值加1,唤醒等待的线程。通过这种方式实现对共享资源的互斥访问,确保数据一致性和避免资源竞争。