C ++在没有while(true)的情况下在主线程中等待未来

C++ Wait in main thread for future without while(true)

问题

我想知道是否可以在没有任何 while(1) 循环的情况下在主线程中等待。 我通过 std::async() 启动了几个线程并在每个线程上计算数字。在我启动线程后,我想收到返回的结果。我用 std::future<>.get().

我的问题

当我收到结果时,我调用 std::future.get(),它会阻塞主线程,直到线程上的计算完成。这会导致执行时间变慢,如果一个线程需要比下一个线程多得多的时间,我可以用完成的结果做一些计算,然后当最慢的线程完成时我可能有一些进一步的计算。

有没有办法让主线程空闲直到任何线程完成 运行?我想到了一个唤醒主线程的回调函数,但我仍然不知道如何在不使其无响应的情况下空闲主函数,即一秒钟而不是 运行 while(true) 循环。

当前代码

#include <iostream>
#include <future>

uint64_t calc_factorial(int start, int number);

int main()
{
    uint64_t n = 1;

    //The user entered number 
    uint64_t number = 0;

    // get the user input
    printf("Enter number (uint64_t): ");
    scanf("%lu", &number);

    std::future<uint64_t> results[4];
    for (int i = 0; i < 4; i++)
    {
        // push to different cores
        results[i] = std::async(std::launch::async, calc_factorial, i + 2, number);
    }

    for (int i = 0; i < 4; i++)
    {
        //retrieve result...I don't want to wait here if one threads needs more time than usual
        n *= results[i].get();
    }
    // print n or the time needed 
    return 0;
}
uint64_t calc_factorial(int start, int number)
{
    uint64_t n = 1;
    for (int i = start; i <= number; i+=4) n *= i;
    return n;
}

我准备了一个运行良好的代码片段,我使用 GMP Lib 来获得较大的结果,但是如果您输入较小的数字,代码将使用 uint64_t 运行。

备注

如果您出于某种原因已经在您的 PC 上编译了 GMP 库,您可以将每个 uint64_t 替换为 mpz_class

我的处理方式有所不同。

除非我有相当具体的理由不这样做,否则我倾向于以相同的一般方式处理大多数多线程代码:使用(线程安全的)队列来传输结果。因此,创建一个线程安全队列的实例,并将对它的引用传递给每个正在生成数据的线程。有任何线程将要收集结果从队列中获取它们。

这使得您在生成每个结果时自动(并且简单)地创建每个结果,而不是卡在等待一个接一个的结果产生。