同时运行两个函数c ++

Jos*_*h G -1 c++ c++11

我正在努力减少计算时间.我试图同时运行两个函数并使用从第一个退出的函数返回值.

想象一下,我有这两个功能.(这些不是我的实际功能,它们只是对函数外观的简单表示)

int countUp (int n){

for(int i = 0; i < 100; i++){

if( i == n ) return i; 

}

return -1;
}

int countDown (int n){

for(int i = 200; i > 0; i--){

if( i == n ) return i; 

}
return -1;
}
Run Code Online (Sandbox Code Playgroud)

主要的是,我如何同时运行它们并获得首先退出的返回值?

How*_*ant 5

这里有一个办法做到这一点使用mutex,并condition_variable建立一个谈话之间countUp,countDown以及main:

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>

std::mutex mut;
std::condition_variable cv;
bool ready = false;

int
countUp(int n)
{
    for(int i = 0; i < 100; i++)
    {
        if( i == n )
            return i; 
    }
    return -1;
}

int
countDown(int n)
{
    for(int i = 200; i > 0; i--)
    {
        if( i == n )
            return i; 
    }
    return -1;
}

int
main()
{
    int result;
    constexpr int N = 200;
    std::thread t1{[&result, N]
                   {
                       int t = countUp(N);
                       std::unique_lock<std::mutex> lk(mut);
                       result = t;
                       ready = true;
                       cv.notify_one();
                   }};
    std::thread t2{[&result, N]
                   {
                       int t = countDown(N);
                       std::unique_lock<std::mutex> lk(mut);
                       result = t;
                       ready = true;
                       cv.notify_one();
                   }};
    {
    std::unique_lock<std::mutex> lk(mut);
    while (!ready)
        cv.wait(lk);
    }
    std::cout << result << '\n';
    t1.join();
    t2.join();
}
Run Code Online (Sandbox Code Playgroud)

在这里我使用了lambdas,所以我不会侵入性地修改countUpcountDown.如果可以修改这些功能,您可以将信号直接移动到它们中并避免使用lambdas.

我选择了有main打印出来的结果,以避免可能后螺纹连接mut,并cv通过一个线程访问得到它们被破坏后main的atexit函数链.如果你可以证明这种访问不会发生,那么你就可以.detach()代替线程.join(),从而消除了main等待较慢thread完成的需要.这可以通过其进行(例如)countUp,countDown以及main共享互斥体的所有权和condition_variable用shared_ptr.

如果它对您的逻辑有些重要,您甚至可以阻止较慢的线程更新结果:

                   if (!ready)
                       result = t;
Run Code Online (Sandbox Code Playgroud)