32位编译的sem_timedwait示例在64位系统配libasan时超时异常
sem_timedwait 在先调用 sem_post 时超时(32位 ASAN 环境下)
问题复现
基于Ubuntu Focal在线手册的sem_timedwait示例修改代码后,出现异常:
- 测试场景:通过
sleep确保sem_post先于sem_timedwait调用,且用sem_getvalue验证信号量计数已增至1 - 预期结果:
sem_timedwait立即返回成功 - 实际结果:
sem_timedwait触发超时
复现环境
该问题在以下环境中均能稳定复现:
- 禁用WSL的Docker Ubuntu 20.04(g++9 multilib)容器
- 全新安装的WSL Debian 9(g++6 multilib)
- WSL Ubuntu 20.04(g++9 multilib)
- Hyper-V上的Ubuntu 20.04虚拟机
已执行apt update更新系统包,也曾卸载g9改用g10(对应libasan.so.6),问题未得到解决。
编译与运行差异
针对test_sem.cpp的编译测试结果:
- 带
-m32和libasan编译:运行后出现非预期超时 - 不带
-m32编译:运行符合预期,sem_timedwait立即成功 - 带
-m32但不带libasan编译:运行符合预期,sem_timedwait立即成功
额外尝试
为排查问题,进行了以下尝试,均未解决:
- 用线程替代信号触发
sem_post,问题仍存在 - 使用
sem_clockwait(分别指定CLOCK_REALTIME和CLOCK_MONOTONIC时钟),问题仍存在
内容的提问来源于stack exchange,提问作者Claudio_G
相关产品推荐
相关产品推荐

