使用cv::imread和cv::cvtColor时出现data race的问题出在哪里?
数据竞争问题成因分析
该数据竞争和你编写的上层业务代码无关,所有竞争操作的调用栈都指向libtbb.so.2(Intel TBB线程构建模块运行库),具体成因分为两类:
- TSan假阳性:你编译自身代码时开启了
-fsanitize=thread参数,但你通过Arch软件源安装的预编译OpenCV、TBB库均未添加ThreadSanitizer编译插桩,TSan无法识别TBB内部的线程同步逻辑,会将TBB内部的合法内存操作误判为数据竞争。 - 依赖库内部已知问题:OpenCV 4.x版本默认启用TBB作为并行计算后端,你调用的
cv::cvtColor处理图片时会自动启动TBB线程池做并行像素转换,你使用的4.5.4版本OpenCV绑定的旧版TBB在线程池销毁、资源回收阶段确实存在低影响的未修复数据竞争,该问题不会导致上层业务逻辑崩溃或计算结果错误。
验证方法
你可以通过以下操作确认问题来源:
在main函数入口处添加cv::setNumThreads(0);,强制OpenCV所有算法走单线程逻辑,不会启动TBB线程池,若重新运行后TSan不再报错,即可确认问题完全来自TBB/OpenCV内部并行逻辑。
如果你的程序实际运行无崩溃、计算结果无异常,该TSan警告可以直接忽略,不需要修改上层代码。
内容的提问来源于stack exchange,提问作者425nesp
相关产品推荐
相关产品推荐

