Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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+中异步/未来的数量+;11_C++_C++11_Future - Fatal编程技术网

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;
}
对我来说,这个程序崩溃了。我怀疑,同时实际运行的期货数量是有限制的。如果我将迭代次数减少到两个数量级,它就会工作

因此,有两个问题:

  • 在C++11中实际运行futures是否有限制

  • 为什么这段代码会崩溃?如果我在“async()”之后立即显式执行“get()”,那么它必须在下一次迭代之前完成future,这意味着一次只能运行一个future

  • 更新

    我已将代码简化为:

    #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

  • 很明显,实现是有限制的,就像数组的大小是有限制的一样。如果启动策略为lauch::async且系统无法启动新线程,则std::async可能会发出错误信号“资源不可用\u重试”。但你不会犯这个错误

  • 该程序不应该崩溃,对我来说也不会崩溃(VS11 x64,发布版本,相同的源代码和命令行)

    我相信,即使没有
    .get()
    ,程序也不会同时执行多个异步操作。将future指定给局部变量,future在每次循环迭代中都会被销毁,从而迫使异步操作在下一次循环迭代中开始另一个操作之前完成


  • 尝试用Try-catch将代码封装在main()中,并检查它是否抛出std::exception。这可能会给你一个暗示。 除此之外,VS中的C++11仍然是测试版

  • 不,标准并没有说明线程支持库的限制(包括线程、未来等)

  • 这取决于线程支持库和底层API的实现质量。正如你所说的:<代码> f GET()/Cube >等待任务的补充(这个行为需要C++标准)。当库实现可能无法重用资源(如底层API的线程句柄)时,可能会导致系统资源不足和程序崩溃。这是图书馆实施的质量

  • 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