2

std::asyncstd::futurefrom を組み合わせて使用​​していC++ 11ます。コードで実行する特定のアクティビティに time_out を強制するために使用していますが、サーバーに接続しようとすると時間かかる場合があります。

コードは次のとおりです。

#include <future>
#include <chrono>

std::size_t PotentiallyLongRunningActivity() {
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(10000s);
    return 10;
}

bool DoActivity() {

  bool activity_done = false;
  auto my_future_result(std::async(std::launch::async, []() {
      return PotentiallyLongRunningActivity(); //returns size_t
  }));

  std::future_status my_future_status = my_future_result.wait_for(std::chrono::milliseconds(800));
  if (my_future_status == std::future_status::timeout) {
      activity_done = false;
  }
  else if (my_future_status == std::future_status::ready) {
      if (my_future_result.valid() && my_future_result.get() > 0) {
          activity_done = true;
      }
  }

  return activity_done;
  //my_future_result hangs while exiting this method !!!
}

int main(int argc, char *argv[])
{
    DoActivity();
    return 0;
}

ほとんどの場合、問題なく動作します。多くの場合、未来はタイムアウトし、準備ができていると報告されます。しかし、私が観察している奇妙な動作はmy_future_result、スコープ外に出るとハングするため、場合によっては UI がハングすることです。my_future_result.get()メソッドを終了する直前に呼び出された場合に返されない呼び出しを繰り返すことで、これを確認しました。

どうすればこれを回避できますか? をキャンセルまたは削除または終了する方法はありstd::futureますか?

4

4 に答える 4