首页 > 解决方案 > 如何在 C++ 中使用 packaged_task 实现异步等待循环?

问题描述

让我们说,我们packaged_task用于在程序中实现异步工作。

#include <map>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <future>
#include <thread>
#include <chrono>

int main()
{
    std::packaged_task<int()> packagedTaskOne([]()
        {
            using namespace std::chrono_literals;
            std::this_thread::sleep_for(4s);
            return 4;
        });

    std::future<int> futureResultOne = packagedTaskOne.get_future();
    std::thread tOne(std::move(packagedTaskOne));

    futureResultOne.wait();
    tOne.join();

    std::cout << "done\n";

    return 0;
}

我几乎无法想象如何waiting cursor在 C# 中实现,因为我可以使用类似的东西while(!Task.Run(async () => await _service.GetValue()).IsCompleted)并输出一些显示加载的点。我想要同样的,packaged_task但我不明白如何将它与while循环融合,因为我没有得到我应该检查这个线程是否完成的条件。如何在 C++ 中使用packaged_task?

标签: c++multithreading

解决方案


如果您不想使用futureResultOne.get();来避免阻塞,以下是一种检查您的任务是否已在主线程中完成或未完成的方法(当然您可以使用独立的线程)。

#include <iostream>
#include <future>
#include <thread>
#include <chrono>
#include <condition_variable>

using namespace std::chrono_literals;

std::condition_variable cv;
bool theThreadHasFinished;
std::mutex mut;
int main()
{
    std::packaged_task<int()> packagedTaskOne([]{
                                                  std::this_thread::sleep_for(4s);
                                                  return 4;
                                              });

    std::future<int> futureResultOne = packagedTaskOne.get_future();
    std::thread tOne([&]{packagedTaskOne();
        std::lock_guard lg{mut};
        theThreadHasFinished = true;
        cv.notify_all();});
    tOne.detach();
    std::unique_lock<std::mutex> lock{ mut };
    cv.wait(lock, [ ](){ return theThreadHasFinished; });
    std::cout << "done\n";

    return 0;
}

您可以使用while循环广告wait_for,但这会消耗您的资源


推荐阅读