进程结束后CPU信息未被清零的解决方案
进程结束后CPU信息未被清零的解决方案
非常抱歉,之前的解决方案没有解决您的问题。
根据您的描述,进程结束后 cpu_info_ 里的数据没有被清零。这可能是因为在获取进程信息后,clear_cpu_info_ 函数被调用之前,又执行了一次 module_cpu_info 函数,导致数据被更新为进程结束时的值。
为了解决这个问题,您需要在判断进程存在性并清零 cpu_info_ 之前,先保存进程存在性的结果。然后,在调用 module_cpu_info 函数之前,检查进程存在性的结果,只有在进程存在时才更新 cpu_info_ 的数据。
请参考以下修改后的代码:cppvoid MONITOR_BASE::show_cpu_status(){ std::vector
for (auto &ele : process_info) { if (isSubstring(std::string(std::getenv('AUTO_ROOT')), ele.COMMAND) && ele.COMMAND != '') { LOG(INFO) << 'Process(' << getLastElement(ele.COMMAND) << ') take CPU(' << ele.CPU << '%), MEM(' << ele.MEM << '%), VSZ(' << ele.VSZ / 1024 << ' MB)'; std::string process_name = getLastElement(ele.COMMAND); float cpu = ele.CPU; float mem = ele.MEM; float vsz = ele.VSZ;
bool process_exists = checkProcessExists(process_name); // 保存进程存在性的结果
{ std::lock_guard<std::mutex> lock(cpu_info_mutex_); if (process_exists) // 只有在进程存在时才更新数据 module_cpu_info(process_name, cpu, mem, vsz); }
if (!process_exists) // 当进程不存在时进行清零 { std::lock_guard<std::mutex> lock(cpu_info_mutex_); clear_cpu_info_(process_name); }
pub_memory_.publish(cpu_info_); } }}
通过在进程存在性判断结果保存之后,根据这个结果来决定是否调用 module_cpu_info 函数来更新 cpu_info_ 数据,从而避免了进程结束后数据再次被更新的问题。
请尝试使用修改后的代码,并验证是否解决了数据未被清零的问题。如果问题仍然存在,请提供更多上下文信息,以便我们更好地帮助您解决问题。
原文地址: https://www.cveoy.top/t/topic/tCb 著作权归作者所有。请勿转载和采集!