C++ C+中异步/未来的数量+;11
我正在尝试一个程序:C++ C+中异步/未来的数量+;11,c++,c++11,future,C++,C++11,Future,我正在尝试一个程序: #include <iostream> #include <thread> #include <future> int foo() { return 0; } int main(int argc, char* argv[]) { for (auto i = 0L; i < 10000; ++i) { auto f = std::async(foo); f.get(); } return 0; }
#include <iostream>
#include <thread>
#include <future>
int foo() {
return 0;
}
int main(int argc, char* argv[]) {
for (auto i = 0L; i < 10000; ++i) {
auto f = std::async(foo);
f.get();
}
return 0;
}
对我来说,这个程序崩溃了。我怀疑,同时实际运行的期货数量是有限制的。如果我将迭代次数减少到两个数量级,它就会工作
因此,有两个问题:
#include <future>
int main(int argc, char* argv[]) {
for (auto i = 0L; i < 1000000; ++i) {
auto f = std::async([](){ return 0; });
f.get();
}
return 0;
}
#包括
int main(int argc,char*argv[]){
用于(自动i=0L;i<1000000;++i){
auto f=std::async([](){return 0;});
f、 get();
}
返回0;
}
对我来说,它仍然崩溃。它不会扔,我已经检查过了。但现在我有了一个可见的堆栈跟踪:
async.exe!_Mtx_unlock(_Mtx_internal_imp_t * * mtx) Line 229 C++
async.exe!std::_Mtx_unlockX(_Mtx_internal_imp_t * * _Mtx) Line 84 C++
async.exe!std::_Mutex_base::unlock() Line 47 C++
async.exe!std::unique_lock<std::mutex>::~unique_lock<std::mutex>() Line 284 C++
async.exe!std::_Associated_state<int>::_Set_value(int && _Val, bool _At_thread_exit) Line 358 C++
async.exe!std::_Packaged_state<int __cdecl(void)>::_Call_immediate() Line 569 C++
async.exe!std::_Async_state<int>::`std::U_Nil::ain::ain'::`3'::<lambda_A200A86DFF9A63A1>::operator()() Line 700 C++
async.exe!??$_ApplyX@X@?$_Callable_obj@V<lambda_A200A86DFF9A63A1>@?2???$?0V?$_Bind@$0A@XV<lambda_23AC5A2FBB53FD4D>@?5?main@U_Nil@std@@U23@U23@U23@U23@U23@U23@@std@@@?$_Async_state@H@std@@QEAA@$$QEAV?$_Bind@$0A@XV<lambda_23AC5A2FBB53FD4D>@?5?main@U_Nil@std@@U23@U23@U23@U23@U23@U23@@3@@Z@$0A@@std@@QEAAXXZ() Line 420 C++
async.exe!?_Do_call@?$_Func_impl@U?$_Callable_obj@V<lambda_A200A86DFF9A63A1>@?2???$?0V?$_Bind@$0A@XV<lambda_23AC5A2FBB53FD4D>@?5?main@U_Nil@std@@U23@U23@U23@U23@U23@U23@@std@@@?$_Async_state@H@std@@QEAA@$$QEAV?$_Bind@$0A@XV<lambda_23AC5A2FBB53FD4D>@?5?main@U_Nil@std@@U23@U23@U23@U23@U23@U23@@3@@Z@$0A@@std@@V?$allocator@V?$_Func_class@XU_Nil@std@@U12@U12@U12@U12@U12@U12@@std@@@2@XU_Nil@2@U42@U42@U42@U42@U42@U42@@std@@UEAAXXZ() Line 217 C++
async.exe!std::_Func_class<void,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::operator()() Line 486 C++
async.exe!`Concurrency::details::_MakeVoidToUnitFunc'::`3'::<lambda_25D33530A43E1C90>::operator()() Line 1056 C++
async.exe!std::_Callable_obj<`Concurrency::details::_MakeVoidToUnitFunc'::`3'::<lambda_25D33530A43E1C90>,0>::_ApplyX<Concurrency::details::_Unit_type>() Line 420 C++
async.exe!std::_Func_impl<std::_Callable_obj<`Concurrency::details::_MakeVoidToUnitFunc'::`3'::<lambda_25D33530A43E1C90>,0>,std::allocator<std::_Func_class<Concurrency::details::_Unit_type,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil> >,Concurrency::details::_Unit_type,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::_Do_call() Line 217 C++
async.exe!std::_Func_class<Concurrency::details::_Unit_type,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>::operator()() Line 486 C++
async.exe!`Concurrency::details::_Task_impl<Concurrency::details::_Unit_type>::_ScheduleTask'::`3'::<lambda_7D9BCD859405C05B>::operator()() Line 325 C++
async.exe!Concurrency::details::_PPLTaskHandle<`Concurrency::details::_Task_impl<Concurrency::details::_Unit_type>::_ScheduleTask'::`3'::<lambda_7D9BCD859405C05B> >::operator()() Line 72 C++
async.exe!Concurrency::details::_UnrealizedChore::_InvokeBridge<Concurrency::details::_PPLTaskHandle<`Concurrency::details::_Task_impl<Concurrency::details::_Unit_type>::_ScheduleTask'::`3'::<lambda_7D9BCD859405C05B> > >(Concurrency::details::_PPLTaskHandle<`Concurrency::details::_Task_impl<Concurrency::details::_Unit_type>::_ScheduleTask'::`3'::<lambda_7D9BCD859405C05B> > * _PChore) Line 4190 C++
async.exe!Concurrency::details::_UnrealizedChore::_UnstructuredChoreWrapper(Concurrency::details::_UnrealizedChore * pChore) Line 275 C++
async.exe!Concurrency::details::_PPLTaskChore::_DeletingChoreWrapper(Concurrency::details::_UnrealizedChore * pChore) Line 78 C++
async.exe!Concurrency::details::InternalContextBase::ExecuteChoreInline(Concurrency::details::WorkItem * pWork) Line 1600 C++
async.exe!Concurrency::details::InternalContextBase::Dispatch(Concurrency::DispatchState * pDispatchState) Line 1704 C++
async.exe!Concurrency::details::FreeThreadProxy::Dispatch() Line 191 C++
async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain(void * lpParameter) Line 173 C++
kernel32.dll!0000000076df652d() Unknown
ntdll.dll!0000000076f2c521() Unknown
async.exe_MTX-UNOLD(229)C++
async.exe!STD::TyxMxxunLax(84,C++)
async.exe!STD::μMutExxBase::unCuffor(47)C++
async.exe!STD::UnQuiC++锁::~
async.exe!STD:C++关联St:::StOySub值(int & & Valb,Boo-Y.TythRead Excel)358行C++
async.exe!STD::包C++状态::
async.exe!STD::yasycStIt::“STD::Un::AN::AN”::“3”:::操作程序()(700)C++(++)行
async.exe$_ApplyX@X@?$\可调用_obj@V@?2???$?0V?$\U绑定@$0A@XV@?5?main@U_Nil@性病@@U23@U23@U23@U23@U23@U23@@std@@?$\u异步_state@H@std@@QEAA@$$QEAV?$\u绑定@$0A@XV@?5?main@U_Nil@性病@@U23@U23@U23@U23@U23@U23@ @ 3 @ @ Z@ $0a@ @ STD@ @ QEAXXZ()420行C++
async.exe_你打电话给@?$\u Func吗_impl@U?$\可调用_obj@V@?2???$?0V?$\U绑定@$0A@XV@?5?main@U_Nil@性病@@U23@U23@U23@U23@U23@U23@@std@@?$\u异步_state@H@std@@QEAA@$$QEAV?$\u绑定@$0A@XV@?5?main@U_Nil@性病@@U23@U23@U23@U23@U23@U23@@3@@Z@$0A@@std@@V$allocator@V?$\u Func_class@XU_Nil@性病@@U12@U12@U12@U12@U12@U12@@性病@@@2@XU_Nil@2@U42@U42@U42@U42@U42@U42@@std@@UEAAXXZ()第217行C++
async.exe!St::AyHyffyCys::()()486行C++
async.exe`并发::细节::“MykEvoIDoNoTunFunc”::“3”:::操作程序()(1056)C++
async.exe!STD::AuCababLeObj:::Apple(420)C++
async.exe!STD::{FunsIMPL::O-doAcLead()217行C++
async.exe!St::AyHyffyCys::()()486行C++
async.exe`并发::细节::TaskKIMPL::“计划表:‘:‘3’::::操作程序())(325)C++
async.exe!并发::细节::C++ PPLTASK句柄::操作程序()(72行C++)
async.exe!并发::细节:C++未实现的琐碎::
async.exe!并发::细节::不实现的琐碎::OnNeultRealChrrReWrPrApp:(并发::细节:未实现的CHORL *PCHOR)275行C++
async.exe!并发::细节::Apple PtasaskoRo::OffeldCeleChrrrPraseRead(并发::细节::In untrueDeChan-PoRo.pCHORE)78行C++
async.exe!并发::细节:内部CONTEXBASE::ExuuTeTeReReIn行(并发::细节:工作项*PoWork)1600行C++
async.exe!并发::细节:NealCaleExbase::Debug(并发::Debug状态*pDeCtChestPurt+C++)1704行C++
async.exe!并发::细节:FruteRealService::Debug()191行C++
async.exe!并发::细节:THeReXPyth::TreRePro XORKEY(空洞*LPMODEL)173 C++
内核32.dll!0000000076df652d()未知
ntdll.dll!0000000076f2c521()未知
和线程:
Unflagged 1864 0 Worker Thread ntdll.dll thread ntdll.dll!0000000076f518ca Normal
Unflagged 10964 0 Main Thread Main Thread async.exe!do_signal Normal
Unflagged 7436 0 Worker Thread ntdll.dll thread ntdll.dll!0000000076f52c1a Normal
Unflagged 10232 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::ThreadProxy::SuspendExecution Normal
Unflagged > 10624 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!_Mtx_unlock Normal
Unflagged 4756 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::ThreadProxy::SuspendExecution Normal
Unflagged 11100 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::InternalContextBase::WaitForWork Normal
Unflagged 6440 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!std::vector<std::pair<void (__cdecl*)(void * __ptr64),void * __ptr64>,std::allocator<std::pair<void (__cdecl*)(void * __ptr64),void * __ptr64> > >::_Tidy Normal
未封装1864 0工作线程ntdll.dll线程ntdll.dll!00000000 76F518CA正常
未封装的10964 0主线程主线程async.exe!信号正常吗
未封装的7436 0工作线程ntdll.dll线程ntdll.dll!00000000 76F52C1A正常
未封装的10232 0工作线程async.exe!并发::详细信息::ThreadProxy::ThreadProxyMain async.exe!并发::详细信息::线程代理::挂起执行正常
Unflagged>10624 0工作线程async.exe!并发::详细信息::ThreadProxy::ThreadProxyMain async.exe_Mtx_解锁正常
未封装的4756 0工作线程async.exe!并发::详细信息::ThreadProxy::ThreadProxyMain async.exe!并发::详细信息::线程代理::挂起执行正常
未封装的11100 0工作线程async.exe!并发::详细信息::ThreadProxy::ThreadProxyMain async.exe!并发::详细信息::InternalContextBase::WaitForWork正常
未封装的6440 0工作线程async.exe!并发::详细信息::ThreadProxy::ThreadProxyMain async.exe!标准::向量::_正常
我使用的是VS 11.0.40825.2 PREREL
.get()
,程序也不会同时执行多个异步操作。将future指定给局部变量,future在每次循环迭代中都会被销毁,从而迫使异步操作在下一次循环迭代中开始另一个操作之前完成
尝试用Try-catch将代码封装在main()中,并检查它是否抛出std::exception。这可能会给你一个暗示。 除此之外,VS中的C++11仍然是测试版
Unflagged 1864 0 Worker Thread ntdll.dll thread ntdll.dll!0000000076f518ca Normal
Unflagged 10964 0 Main Thread Main Thread async.exe!do_signal Normal
Unflagged 7436 0 Worker Thread ntdll.dll thread ntdll.dll!0000000076f52c1a Normal
Unflagged 10232 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::ThreadProxy::SuspendExecution Normal
Unflagged > 10624 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!_Mtx_unlock Normal
Unflagged 4756 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::ThreadProxy::SuspendExecution Normal
Unflagged 11100 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!Concurrency::details::InternalContextBase::WaitForWork Normal
Unflagged 6440 0 Worker Thread async.exe!Concurrency::details::ThreadProxy::ThreadProxyMain async.exe!std::vector<std::pair<void (__cdecl*)(void * __ptr64),void * __ptr64>,std::allocator<std::pair<void (__cdecl*)(void * __ptr64),void * __ptr64> > >::_Tidy Normal
g++ -std=c++11 -o main *.cpp
g++ -std=c++11 -o main -lpthread *.cpp