C++ 11通过两种算法之一完成任务

Pau*_*tos 5 c++ algorithm multithreading c++11

我有两种算法来解决任务X ().

如何为算法1启动一个线程,为算法2启动一个线程并等待第一个算法完成,之后我杀了另一个并继续?

我已经看到,joinstd::thread会让我等待它完成,但我不能做join两个线程,否则我会等待既能完成.我想发布它们并等到其中一个完成.实现这一目标的最佳方法是什么?

Use*_*ess 2

首先,不要杀死失败的算法。只需让它运行完成并忽略结果即可。

现在,最接近您要求的是拥有一个 mutex+condvar+result 变量(或更可能是两个结果,每个算法一个)。

代码看起来像

X result1, result2;
bool complete1 = false;
bool complete2 = false;

std::mutex result_mutex;
std::condition_variable result_cv;

// simple wrapper to signal when algoN has finished

std::thread t1([&]() { result1 = algo1();
                       std::unique_lock lock(result_mutex);
                       complete1 = true;
                       result_cv.notify_one();
                     });
std::thread t2([&]() { result2 = algo2();
                       std::unique_lock lock(result_mutex);
                       complete2 = true;
                       result_cv.notify_one();
                     });

t1.detach();
t2.detach();

// wait until one of the algos has completed
int winner;
{
  std::unique_lock lock(result_mutex);
  result_cv.wait(lock, [&]() { return complete1 || complete2; });
  if (complete1) winner=1;
  else           winner=2;
}
Run Code Online (Sandbox Code Playgroud)

其他机制,包括 future/promise 机制,需要主线程忙等待。唯一的非忙等待替代方案是将成功后处理移至 a call_once:在这种情况下,主线程应该只加入两个子线程,而第二个子线程将在完成处理并意识到它丢失时简单地返回。