条件变量可复用类实现校验及valgrind still reachable问题咨询
问题1:ConditionalVariable类的潜在问题
- 函数拼写错误:超时等待的函数名
waitForCondtion拼写错误,缺失了字母i,正确应为waitForCondition,极易导致调用时出错。 - 无锁访问共享变量:
isConditionNowSet()方法直接读取共享变量_condition,未加锁保护,多线程场景下属于未定义行为,即使是读操作也需要持有锁,或者可以将_condition改为std::atomic<bool>类型避免简单读写的加锁开销。 - 超时时钟选择不合理:超时等待接口使用
std::chrono::system_clock计算超时时间,该时钟是系统实时时钟,会被NTP同步、用户手动修改时间等操作影响,导致超时逻辑不符合预期,建议替换为不受系统时间调整影响的std::chrono::steady_clock。 - 析构逻辑缺失:当前析构函数为空,如果对象销毁时还有线程处于等待状态,会导致线程访问已销毁的对象、挂死等未定义行为。建议在析构函数中加锁设置
_condition = true,并调用_cv.notify_all()唤醒所有等待线程,等待线程感知条件后退出再完成对象销毁。 - 虚析构冗余:如果该类没有被继承的设计需求,不需要声明为虚析构函数,多余的虚表指针会增加不必要的内存开销;如果明确要作为基类使用则保留即可。
问题2:valgrind报still reachable问题确认
你查阅到的信息属实,空gtest用例也会触发这类报错的情况是存在的:gtest框架内部会初始化部分全局静态资源,这部分内存会在进程退出时由操作系统统一回收,valgrind检测时仍然可以找到指向这部分内存的有效指针,因此会标记为still reachable,不属于业务代码的内存泄漏,可以直接忽略。
只要valgrind报告中没有出现definitely lost、indirectly lost、possibly lost三类错误,就不存在需要你修复的内存问题。
内容的提问来源于stack exchange,提问作者Soumyajit Roy
相关产品推荐
相关产品推荐

