面试题答案
一键面试- 使用标志变量
- 策略:在进入信号处理函数时设置一个标志变量,在主程序中检查该标志变量,若标志被设置则暂停调用不可重入的系统调用,直到信号处理函数完成。
- 优点:实现简单,不需要复杂的同步机制。
- 缺点:主程序需要频繁检查标志变量,增加了额外的开销;如果主程序长时间忽略标志变量,可能导致不可重入系统调用在不合适的时候被调用。
- 适用场景:对性能要求不是特别高,且主程序逻辑相对简单,能够及时响应标志变量的场景。
- 使用互斥锁
- 策略:在调用不可重入系统调用的代码段前后加互斥锁。信号处理函数中先获取互斥锁,再调用不可重入系统调用,主程序中同样,在调用相关代码段时获取互斥锁。
- 优点:能有效保证可重入性,逻辑清晰,对于多线程环境也能很好适应。
- 缺点:引入了同步开销,可能导致死锁,如果多个线程或信号处理函数同时竞争互斥锁且获取顺序不当。
- 适用场景:适用于多线程编程且对同步要求较高,能够谨慎处理锁操作避免死锁的场景。
- 使用线程局部存储(TLS)
- 策略:将与不可重入系统调用相关的全局变量改为线程局部存储变量。信号处理函数和主程序使用各自独立的变量副本。
- 优点:从根本上避免了全局变量带来的重入问题,对原有代码改动相对较小。
- 缺点:需要编译器和操作系统的支持,不同平台可能实现方式略有差异;如果对TLS变量使用不当,可能仍然会出现数据一致性问题。
- 适用场景:适用于不同平台兼容性要求不高,对数据一致性有一定要求且希望减少对代码大规模改动的场景。
- 异步信号安全函数替换
- 策略:寻找可重入的异步信号安全函数来替代不可重入的系统调用。
- 优点:从根源上解决了可重入问题,无需额外的同步机制。
- 缺点:并非所有不可重入系统调用都有合适的可重入替代函数;即使有替代函数,其功能可能与原系统调用不完全一致,可能需要对业务逻辑进行调整。
- 适用场景:适用于有合适可重入替代函数且业务逻辑能够适应这种替换的场景。