Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;多线程延迟启动_C++_Multithreading - Fatal编程技术网

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