在std :: async中调用self是否安全

时间:2016-02-24 11:10:34

标签: c++11

我想检查Mysql连接是否还活着。 (使用Mysql-connector-c ++)

所以..我每5分钟调用一次“检查功能”

像这样

void checkConnection()
{
    std::this_thread::sleep_for(std::chrono::minutes(5));
    // -- check connection
    std::async(std::launch::async, checkConnection); // Here
}

安全吗?? ??

1 个答案:

答案 0 :(得分:0)

在您指定的情况下,它是安全的,因为std::launch::async - 当它自己时 - 指定您希望在单独的线程上完成此操作。否则,由于递归调用,存在堆栈溢出的危险。

但请注意,此处的行为是:

  1. 在线程T1上睡5分钟
  2. 检查T1上的连接
  3. 开始新帖子T2
  4. 结束线程T1
  5. 在T2线上睡5分钟
  6. ...
  7. 所以你总是使用一个线程,除非你每次都要为创建和破坏付费。最好只使用一个线程,例如

    void checkConnection(std::atomic<bool>& stopFlag)
    {
        using namespace std::chrono; // for 5min shorthand, if C++14
    
        while (!stopFlag) {
            std::this_thread::sleep_for(5min);
            // -- check connection
        }
    }
    

    或者更好的是,使用可以指定延迟的线程池。但是,目前尚未提供标准库。