C++11 监视器类,测试应用程序不想退出

C++11 Watchdog class, test application doesn't want to exit

本文关键字:应用程序 不想 退出 测试 监视器 C++11      更新时间:2023-10-16

我正在使用在线C++11编译器,链接,此处找到:cpp.sh(c shell)。

在我当前的项目中,我想拥有一个看门狗类,以便能够以某种方式检查线程或FSM的状态(例如)。

经过一些工作(我不是C++11大师),我终于得到了下面的代码,可以编译好的。
我也做了一些基本/微不足道的测试,但似乎测试程序不想退出
它说"运行程序",而(强制)退出的唯一方法是击中" stop "按钮... :(

好吧,我的问题我在做什么错?
高度赞赏您可以提供的任何想法,您可以提供的建议。

这是full code,包括我的测试应用:

看门狗(AS MCVE):

#include <thread>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <iostream>
using namespace std::chrono;
class Watchdog
{
public:
    Watchdog();
    ~Watchdog();
    void Start(unsigned int milliseconds, std::function<void()> callback = 0);
    void Stop();
    void Pet();
private:
    unsigned int m_interval;
    std::atomic<bool> m_running;
    std::thread m_thread;
    std::function<void()> m_callback;
    std::mutex m_mutex;
    steady_clock::time_point m_lastPetTime;
    std::condition_variable m_stopCondition;
    void Loop();
}; 
Watchdog::Watchdog()
{
    m_running = false;
}
Watchdog::~Watchdog()
{
    Stop();
}
void Watchdog::Start(unsigned int milliseconds, std::function<void()> callback)
{
    std::unique_lock<std::mutex> locker(m_mutex);
    if(m_running == false)
    {
        m_lastPetTime = steady_clock::now();
        m_interval = milliseconds;
        m_callback = callback;
        m_running = true;
        m_thread = std::thread(&Watchdog::Loop, this);
    }
}
void Watchdog::Stop()
{
    std::unique_lock<std::mutex> locker(m_mutex);
    if(m_running == true)
    {
        m_running = false;
        m_stopCondition.notify_all();
        m_thread.join();
    }
}
void Watchdog::Pet()
{
    std::unique_lock<std::mutex> locker(m_mutex);
    m_lastPetTime = steady_clock::now();
    m_stopCondition.notify_all();
}
void Watchdog::Loop()
{
    std::unique_lock<std::mutex> locker(m_mutex);
    while(m_running == true)
    {
        if(m_stopCondition.wait_for(locker, milliseconds(m_interval)) == std::cv_status::timeout)
        {
            if(m_callback != nullptr)
                m_callback();
        }
    }
}  
int main(int argc, char *argv[])
{
    Watchdog wdog;
    wdog.Start(3000, [] { std::cout << " WDOG TRIGGERED!!! "; });
    for(auto i = 0; i < 10; i++)
    {
        std::cout << "[+]";
        wdog.Pet();
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}  

-

您在这里做一个僵局。

void Watchdog::Stop()
{
    std::unique_lock<std::mutex> locker(m_mutex);
    if(m_running == true)
    {
        m_running = false;
        m_stopCondition.notify_all();
        m_thread.join();
        ^ ~~~~~~~~~~~~~~
          m_mutex is locked; m_thread cannot continue execution
    }
}

一些其他建议:使用简单的if条件,请勿与truefalse进行比较。