C++11 在std::async中调用self安全吗

C++11 在std::async中调用self安全吗,c++11,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 } 它安全吗?..

我想检查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
}

它安全吗?..

在您指定的情况下,它是安全的,因为
std::launch::async
-当它本身指定要在单独的线程上执行此操作时。否则,危险在于递归调用导致的堆栈溢出

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

  • 在线程T1上睡眠5分钟
  • 检查T1上的连接
  • 启动新线程T2
  • 端螺纹T1
  • 在线程T2上睡眠5分钟
  • 所以你总是使用一个线程,除非你每次都要为创建和销毁付费。最好只用一根线,例如

    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
        }
    }
    
    void checkConnection(标准::原子和停止标志)
    {
    使用命名空间std::chrono;//进行5分钟的速记,如果是C++14
    而(!stopFlag){
    std::此线程::睡眠时间(5分钟);
    //--检查连接
    }
    }
    

    或者更好的是,使用一个线程池,您可以为其指定延迟。但是到目前为止,标准库还没有提供这一功能。

    在您指定的情况下,它是安全的,因为
    std::launch::async
    -when本身指定您希望在单独的线程上执行此操作。否则,危险在于递归调用导致的堆栈溢出

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

  • 在线程T1上睡眠5分钟
  • 检查T1上的连接
  • 启动新线程T2
  • 端螺纹T1
  • 在线程T2上睡眠5分钟
  • 所以你总是使用一个线程,除非你每次都要为创建和销毁付费。最好只用一根线,例如

    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
        }
    }
    
    void checkConnection(标准::原子和停止标志)
    {
    使用命名空间std::chrono;//进行5分钟的速记,如果是C++14
    而(!stopFlag){
    std::此线程::睡眠时间(5分钟);
    //--检查连接
    }
    }
    

    或者更好的是,使用一个线程池,您可以为其指定延迟。但到目前为止,标准库还没有提供这一功能。

    是什么让您认为它不安全?一般来说,使用std::async可以摆脱线程管理,并提供基于任务的编程。我担心无限线程的创建。谢谢你!你凭什么认为它不安全?一般来说,使用std::async可以摆脱线程管理,并提供基于任务的编程。我担心无限线程的创建。谢谢你!