首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11看门狗类,测试应用程序不想退出

C++11看门狗类,测试应用程序不想退出
EN

Stack Overflow用户
提问于 2017-03-11 09:08:16
回答 1查看 937关注 0票数 2

我使用的是一个在线C++11编译器,链接在这里:cpp.sh (C++ Shell)。

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

经过一些工作(我不是C++11大师),我终于得到了下面的代码,这样就可以编译了。

我还做了一些基本的/琐碎的测试,但是测试程序似乎不想退出

上面写着“程序运行”,强制退出的唯一方法是按下“停止”按钮.:(

好吧,我的问题:我做错了什么?

您能提供的任何想法和建议都将受到高度赞赏。

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

看门狗:

代码语言:javascript
复制
#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));
    }
}  

-

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-11 09:15:23

你在这里陷入僵局。

代码语言:javascript
复制
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相比。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42733379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档