`std::async` 用于 C++ 中的异步回复

问题描述

概述: 我有一个客户端 - 服务器实现,它使用 DBus(sdbus-c++) 向服务器发送异步请求。现在,我的服务器与硬件 API 进行交互,这些 API 同步运行,并且还需要花费大量时间来生成回复。所以我在服务器上有一个 std::queue,它保存收到的所有异步请求,并一一处理它们。服务端处理后,以为发送的请求注册的回调形式发回回复。

#client.h

class Client
{ 
    Client();
    ~Client();

    void sendRequestA() 
    {  
       ... use DBus async call to send request to server
    }

    void sendRequestB() {...}
    
    protected:
    virtual void replyCallbackA(const uint8_t& status) = 0 ; // ... callback invoked by the DBus server   
    virtual void replyCallbackB(const uint8_t& status) = 0 ;
}

Ì 在使用 std::async 测试此特定用例时遇到问题。

#test.cpp


//std::future<void> gFuture;

class ClientTest : public Client
{
  ClientTest();
  ~ClientTest();
  
  std::future<void> m_future;

  virtual void replyCallbackA(const uint8_t& status) override
  {
      std::cout<<"replyCallbackA status = "<< status<< "\n";
      m_future.get();
      //gFuture.get();
  }

  virtual void replyCallbackB(const uint8_t& status) override
  {
      std::cout<<"replyCallbackB status = "<< status<< "\n";
      m_future.get();
      //gFuture.get();

  }

}

int main()
{
   ClientTest cTest;
   cTest.m_future = std::async(std::launch::async,&ClientTest::sendRequestA,&cTest);
   cTest.m_future = std::async(std::launch::async,&ClientTest::sendRequestB,&cTest);

   //gFuture = = std::async(std::launch::async,&cTest);  -- no change in behavior with use of a global std::future.
}

我的理解是,sendRequestAsendRequestB 将被调用,并且回调函数也将被调用。
但是,在这种情况下,main 在调用 sendRequestA & sendRequestB 后立即退出并且未收到回调响应。

编辑:我也尝试将全局变量用于 std::future,但行为是相同的。

谁能告诉我我的理解哪里有问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)