简单boost::asio::thread_pool程序触发Helgrind同步错误如何修复?
问题根因
这个同步错误属于Helgrind的误报,和你编写的业务代码无关:
Boost.Asio内部的posix_event为了提升多核场景下的调度性能,采用了「先释放关联互斥锁、再调用pthread_cond_signal唤醒等待线程」的实现逻辑。该实现完全符合POSIX线程标准,不存在实际的同步风险,但Helgrind的默认检测规则要求调用pthread_cond_signal/pthread_cond_broadcast时必须持有对应条件变量绑定的互斥锁,因此触发了错误提示。
修复方案
你不需要修改现有业务逻辑,可任选以下两种方案处理:
方案1:添加Helgrind抑制规则
自定义Helgrind的抑制规则文件,过滤掉来自Boost.Asio内部的这类误报。首先创建boost_helgrind.supp文件,写入以下规则:{ boost_asio_cond_signal_no_lock Helgrind:Dubious:CondSignalLockNotHeld fun:pthread_cond_*signal fun:*boost*asio*detail*posix_event*maybe_unlock_and_signal_one* }运行Helgrind时指定该抑制文件即可:
valgrind --tool=helgrind --suppressions=boost_helgrind.supp ./你的程序名方案2:关闭Boost.Asio的条件变量优化
编译程序时添加宏定义BOOST_ASIO_DISABLE_CONDVAR_SPEEDUP,禁用Asio内部的性能优化,强制实现为「持有互斥锁时发送条件变量信号」,即可消除Helgrind的错误提示,编译命令示例:g++ test.cpp -o test -lboost_system -lboost_thread -DBOOST_ASIO_DISABLE_CONDVAR_SPEEDUP
内容的提问来源于stack exchange,提问作者Michael Polyntsov

