在不同的线程中执行lambda函数



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

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

这应该行得通。但这给我们留下了一个大问题:后台线程需要以锁定的响应互斥体开始,而主线程需要以锁住的请求互斥体开始。。。

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

将任务传递到后台线程可以由生产者-消费者队列完成。不依赖于第三方库的简单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>>就足够了。队列增加了灵活性,可以同时添加许多后台任务。

最新更新