C++11 Watchdog class,测试应用程序不想退出

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

我正在使用在线 C++11 编译器,link 可在此处找到:cpp.sh (C++ Shell)。

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

经过一些工作(我不是 C++11 高手),我终于得到了下面的代码,编译正常。
我也做了一些basic/trivial测试,但似乎测试程序不想退出
它说“程序运行”并且(强制)退出的唯一方法是点击“停止”按钮...... :(

好吧,我的问题我做错了什么?
非常感谢您提供的任何想法和建议。

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

Watchdog (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进行比较。