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标志,并假定任务已完成
按照目前的要求,这种不一致是不可能发生的。简单回答:因为委员会决定应该这样做。