在不同线程中执行 lambda 函数

execute a lambda function in different thread

由于固定需求,我需要在特定的线程中执行一些代码,然后return一个结果。启动该操作的主线程应同时被阻止。

void background_thread()
{
  while(1)
  {
    request.lock();
    g_lambda();
    response.unlock();
    request.unlock();
  }
}

void mainthread()
{
  ...
  g_lambda = []()...;
  request.unlock();
  response.lock();
  request.lock();
  ...
}

这应该有效。但这给我们留下了一个大问题:后台线程需要在响应互斥锁锁定的情况下启动,而主线程需要在请求互斥锁锁定的情况下启动...

我们如何才能做到这一点?想不出好办法。这不是反模式吗?

将任务传递给后台线程可以通过生产者-消费者队列来完成。不依赖于第 3 方库的简单 C++11 实现将有 std::condition_variable,它由后台线程等待并由主线程通知,std::queue 任务,以及 std::mutex 到守护这些。

可以通过std::promise/std::future将结果返回到主线程。最简单的方法是将 std::packaged_task 作为队列对象,让主线程创建 packaged_task,将其放入队列,通知 condition_variable 并等待 packaged_task 的未来。

如果您要从一个线程一次创建一个任务,您实际上不需要 std::queue - 只需一个 std::unique_ptr<std::packaged_task>> 就足够了。队列增加了同时添加许多后台任务的灵活性。