Aru*_*run 5 multithreading c++11 stdasync stdthread
考虑以下我试图启动 10000 个线程的两个代码片段:
片段 1
std::array<std::future<void>, 10000> furArr_;
try
{
size_t index = 0;
for (auto & fut : furArr_)
{
std::cout << "Created thread # " << index++ << std::endl;
fut = std::async(std::launch::async, fun);
}
}
catch (std::system_error & ex)
{
std::string str = ex.what();
std::cout << "Caught : " << str.c_str() << std::endl;
}
// I will call get afterwards, still 10000 threads should be active by now assuming "fun" is time consuming
Run Code Online (Sandbox Code Playgroud)
片段 2
std::array<std::thread, 10000> threadArr;
try
{
size_t index = 0;
for (auto & thr : threadArr)
{
std::cout << "Created thread # " << index++ << std::endl;
thr = std::thread(fun);
}
}
catch (std::system_error & ex)
{
std::string str = ex.what();
std::cout << "Caught : " << str.c_str() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
第一种情况总是成功。即我能够创建 10000 个线程,然后我必须等待所有线程完成。在第二种情况下,在创建 1600 多个线程后,我几乎总是最终得到一个异常(“资源不可用再试一次”)。
使用 std::launch::async 的启动策略,我认为这两个片段的行为方式应该相同。使用 async 启动策略的 std::async 与显式使用 std::thread 启动线程有何不同?
我在 Windows 10,VS2015 上,二进制文件是在 x86 发布模式下构建的。
首先,感谢Igor Tandetnik为我提供了这个答案的方向。
当我们使用std::async(使用异步启动策略)时,我们说:
“我想在一个单独的线程上完成这项工作”。
当我们使用时,std::thread我们说:
“我想在一个新线程上完成这项工作”。
细微的差别意味着async(通常)使用线程池实现。这意味着如果我们多次调用一个方法async,通常该方法中的线程 id 会重复,即将async多个作业分配给池中的同一组线程。而使用std::thread,它永远不会。
这种差异意味着与使用启动策略相比async,显式启动线程可能会占用更多资源(因此是例外)async。
| 归档时间: |
|
| 查看次数: |
2971 次 |
| 最近记录: |