C ++标准规定有关的执行下面std::call_once
与抛出异常(§30.4.4.2/ 2)功能:
2 /效果:不调用其FUNC call_once的的执行是一种被动的执行。 调用它的FUNC call_once的的执行是一个积极的执行。 积极执行将调用invoke(DECAY_COPY(STD ::向前(FUNC)),DECAY_COPY(标准::前进(参数))...)。 如果以FUNC这样的调用抛出异常的执行是例外,否则它返回。 异常执行应传播例外call_once的调用者。 在任何给定once_flag call_once的所有执行:最多一人应为返回的执行; 如果有一个恢复执行,它应是最后一个活动的执行; 有的只是如果有一个返回执行被动执行。 [注:被动处决允许其它线程可靠地观察由前面的返回执行所产生的结果。 - 注完]
我使用的Visual Studio 2012,并运行下面的代码:
void f(){
throw std::exception( "Catch me!" );
}
int main( int argc, char* argv[] ){
once_flag flag;
try{
call_once( flag, f );
} catch( const std::exception& e ){
cout << e.what() << endl;
}
return 0;
}
我的结果是:在catch块中运行的代码,并打印消息,但该方案存在时,我接到一个电话,以abort()
和以下信息打印到COUT:
... \ mutex.c(38)互斥破坏而忙碌
这是应该发生的?