微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不同线程中执行 lambda 函数

如何解决在不同线程中执行 lambda 函数

由于固定需求,我需要在特定线程中执行一些代码,然后返回一个结果。启动该操作的主线程应在此期间被阻塞。

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

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

这应该有效。但这给我们留下了一个大问题:后台线程需要从响应互斥锁开始,而主线程需要从请求互斥锁开始......

我们怎样才能做到这一点?我想不出什么好办法。无论如何,这不是一种反模式吗?

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。