C++ c++;多线程延迟启动
我想知道在哪种情况下需要C++ c++;多线程延迟启动,c++,multithreading,C++,Multithreading,我想知道在哪种情况下需要std::launch::deferred 据我所知,多线程的目的是另一个线程在后台处理某些事情或计算,并在任务完成时返回一个值。它应该在创建线程后立即开始。既然如此,为什么我们需要这种类型的延迟启动?当您可能只需要操作结果时,您可以使用延迟启动。例如,您可以执行以下操作,并在调用get()或wait()时对未来进行评估 int SomeFunction() { // .... std::future<int> futLazy = std::a
std::launch::deferred
据我所知,多线程的目的是另一个线程在后台处理某些事情或计算,并在任务完成时返回一个值。它应该在创建线程后立即开始。既然如此,为什么我们需要这种类型的延迟启动?当您可能只需要操作结果时,您可以使用延迟启动。例如,您可以执行以下操作,并在调用
get()
或wait()
时对未来进行评估
int SomeFunction()
{
// ....
std::future<int> futLazy = std::async( std::launch::deferred, []{ return SomeComplexOperation(); });
if( GetSomeCondition() )
{
// Do something involving futLazy.get()
}
return 1;
}
intsomefunction()
{
// ....
std::future futdlazy=std::async(std::launch::deferred,[{返回SomeComplexOperation();});
if(GetSomeCondition())
{
//做一些涉及懒惰的事情。get()
}
返回1;
}
在本例中,只有当GetSomeCondition()
返回true
时,才会调用SomeComplexOperation()。所以这只是一种排队操作的方法,当且仅当需要时才进行评估
既然如此,我们为什么需要这种延期发射呢
这个问题类似于询问为什么&&
和| |
操作员有短路行为。如果操作结果由LHS确定,则短路行为将导致测试中表达式的RHS未计算。短路行为可以用多个if
语句来表示。因此,语言提供了不止一种表达相同想法的方式
类似地,软件组件可以通过显示所涉及的所有任务来更清楚地表达,即使并非所有任务都实际执行,因为组件完成了其工作而不需要其他任务。当然,软件的编写可能会有所不同,只要在任务实际需要运行之前不表达任务即可
例如,代码可以初始化任务数组,并使用循环对其进行迭代。但是,从循环中提前中断将避免执行剩余的任务。出于调试目的,可以使用标志将程序从多线程切换到单线程
//const auto launchPolicy = std::launch::async;
const auto launchPolicy = std::launch::deferred;
void doThings(){
auto fut = async(launchPolicy, []{ thing1(); });
thing2();
fut.wait();
}
如果没有常量
,您甚至可以在运行时更改行为。但它并不完美,单线程模式可能会导致死锁。一般来说,延迟评估是一种优化,可以避免执行不需要的工作。显然,这种机制允许任务被“预处理”,但它只在结果实际被等待时处理工作。但问题是在什么情况下需要这样做。一定有一些现实生活中的例子假设如果你需要结果,它们将为你节省100万美元(或者你正在管理的任何其他资源(CPU时间、磁盘空间、网络带宽等)但是你需要花费十万美元才能得到结果。假设你一个月只需要一次结果。你每天得到一次吗?不。你把事情安排好了,这样当你需要它时,你可以花10万美元来节省100万美元,但当你不需要它时,它会花费你(几乎什么都没有)。这就是这个机制的作用。如果得到的结果很便宜,不用麻烦,就去做。@DaleWilson我认为这个例子对我来说没有意义,因为我们可以使用一些If条件语句来检查是否需要启动线程,而不是使用延迟启动。只是我的想法。但是你不必启动它。你可以st询问答案。[你不一定知道在你需要答案的时候启动它所需要知道的一切。]底线是,如果你不需要它,不要担心它。当有一天你发现你确实需要它时,你就会知道它就在那里。就像最后的例子一样!你也可以使用延迟任务作为回调接口。注册回调的用户在未来传递。框架在未来执行等待来触发回调确认。在这种情况下,它可能有用。@nwp