我正在努力减少计算时间.我试图同时运行两个函数并使用从第一个退出的函数返回值.
想象一下,我有这两个功能.(这些不是我的实际功能,它们只是对函数外观的简单表示)
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)
主要的是,我如何同时运行它们并获得首先退出的返回值?
这里有一个办法做到这一点使用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,所以我不会侵入性地修改countUp和countDown.如果可以修改这些功能,您可以将信号直接移动到它们中并避免使用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)