对于进程存在时 cpu_info_ 值突然变为0,然后又有值的问题,可能是由于并发访问 cpu_info_ 导致的。多线程或多进程同时访问 cpu_info_ 可能会导致数据不一致或竞争条件。

为了解决这个问题,您可以考虑使用互斥锁来保护对 cpu_info_ 的访问,确保只有一个线程或进程能够修改 cpu_info_ 的值。

下面是使用互斥锁进行保护的示例代码:

#include <cstdio>
#include <iostream>
#include <string>
#include <mutex>

void MONITOR_BASE::clear_cpu_info_()
{
    static std::mutex cpu_mutex; // 定义静态互斥锁

    std::string process_name = "auto_ad_memory_monitor";
    std::string check_process_cmd = "pidof " + process_name;

    FILE* pipe = popen(check_process_cmd.c_str(), "r");
    char buffer[128];
    std::string result = "";
    while (fgets(buffer, sizeof(buffer), pipe) != nullptr)
    {
        result += buffer;
    }
    pclose(pipe);

    bool process_exists = !result.empty();

    // 加锁保护对 cpu_info_ 的访问
    std::lock_guard<std::mutex> lock(cpu_mutex);

    if (process_exists)
    {
        // 进程存在,进行相应的操作
        cpu_info_.auto_ad_memory_monitor.cpu.data = 1;
        cpu_info_.auto_ad_memory_monitor.mem.data = 1;
        cpu_info_.auto_ad_memory_monitor.vsz.data = 1;
    }
    else
    {
        // 进程不存在,将对应的 cpu_info_ 值清零
        cpu_info_.auto_ad_memory_monitor.cpu.data = 0;
        cpu_info_.auto_ad_memory_monitor.mem.data = 0;
        cpu_info_.auto_ad_memory_monitor.vsz.data = 0;
    }
}

在这个修改后的代码中,我们引入了一个静态的互斥锁 cpu_mutex,用来保护对 cpu_info_ 的访问。在访问 cpu_info_ 前加锁,然后根据进程是否存在进行相应的操作,最后解锁。

这样,通过互斥锁的保护,可以确保只有一个线程或进程能够修改 cpu_info_ 的值,避免并发访问导致的数据不一致问题。

希望这个修改后的代码能够解决您遇到的问题。如果还有其他问题,请随时提问。

解决多线程访问导致的 CPU 信息不一致问题

原文地址: http://www.cveoy.top/t/topic/kET 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录