Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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++11 如果std::call_once调用的可调用函数尝试在同一std::once_标志上调用std::call_一次,则该函数将挂起_C++11 - Fatal编程技术网

C++11 如果std::call_once调用的可调用函数尝试在同一std::once_标志上调用std::call_一次,则该函数将挂起

C++11 如果std::call_once调用的可调用函数尝试在同一std::once_标志上调用std::call_一次,则该函数将挂起,c++11,C++11,我遇到了由这种行为引起的错误: #include <mutex> std::once_flag onceFlag; void get() { std::call_once(onceFlag, [](){ get(); }); } int main(int argc, char* argv[]) { get(); return 0; } #包括 std::once_标志onceFlag; void get(){ std::调用_一次(onceFlag,[

我遇到了由这种行为引起的错误:

#include <mutex>

std::once_flag onceFlag;

void get() {
    std::call_once(onceFlag, [](){ get(); });
}

int main(int argc, char* argv[]) {
    get();
    return 0;
}
#包括
std::once_标志onceFlag;
void get(){
std::调用_一次(onceFlag,[](){get();});
}
int main(int argc,char*argv[]){
get();
返回0;
}
另一种说法是:

#include <mutex>

std::once_flag onceFlag;

int main(int argc, char* argv[]) {
    std::call_once(onceFlag,
        [](){
            std::call_once(onceFlag,
                [](){}
            );
        }
    );

    return 0;
}
#包括
std::once_标志onceFlag;
int main(int argc,char*argv[]){
std::调用_一次(onceFlag,
[](){
std::调用_一次(onceFlag,
[](){}
);
}
);
返回0;
}
根据我在cppreference()中读到的内容,这是意料之中的,因为对std::call_的第一次调用还没有完成执行:

在执行上述操作之前,组中没有任何调用返回 所选功能的执行成功完成,即, 不会通过异常退出

为什么以上是一个要求?不能在调用函数之前设置once_标志,并在引发异常时重置吗

为什么以上是一个要求?以前不能设置once_标志吗 调用该函数,并在引发异常时重置

当然不是。在您的提案中,将设置
once_标志
,然后在出现任何故障时重置。这可能会创造比赛条件。用2个线程来考虑这种情况:<代码> TH1和<代码> TH2。两人都在做一些任务,这些任务只需要完成一次。线程依赖于
once\u标志
在您的方案中工作
th1
是由
once_标志保护的内部功能
th2
正在检查
once_flag
条件并停止执行,因为其pov任务已完成。在
th1
中执行任务的过程中,会从
th1
pov抛出异常,因为其他工作人员将完成执行。任务从未完成,因为
th1
失败且
once\u标志未设置,但
th2
已完成,因为设置了
once\u标志,并假定任务已完成


按照目前的要求,这种不一致是不可能发生的。

简单回答:因为委员会决定应该这样做。