在Visual Studio 2015中运行以下内容时遇到问题。
#include <thread>
#include <vector>
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 10000; i++) {
cout << "Loop: " << i << endl;
vector<thread> threads;
for (int j = 0; j < 8; j++) {
try {
threads.push_back(thread([]() {int a = 4; a++; }));
}
catch (const system_error &se) {
cout << se.what() << endl;
exit(1);
}
}
for (int j = 0; j < 8; j++) {
threads.at(j).join();
}
}
return 0;
}
在运行了几千个循环之后,程序捕获带有输出的system_error:
...
3994
3995
3996
3997
3998
resource unavailable try again: resource unavailable try again
我知道可以同时运行最多线程数,但在这种情况下,只有8个线程同时运行,之后它们被销毁。是否可以创建总数的最大值?
我已经尝试使用g ++在Linux上运行上面的程序,并且只在Windows(包括visual studio和mingw)上运行它才能发生错误。有帮助吗? 感谢。
答案 0 :(得分:2)
最好通过了解如何在Windows上创建线程来描述这里发生的事情。
每个线程在创建时都会被赋予default 1Mb stack size。您会注意到您将获得大约3998个线程,这些线程对应于大约3.9Gb的已用用户地址空间。这不是偶然的,因为这对应于64位窗口(内核空间为64位)下32位进程可用的大部分4Gb用户地址空间。额外的空间是可执行文件和必要的系统DLL加载的地方。
通过将构建更改为64位,您可以大规模扩展该地址空间。拥有10000个带有1Mb堆栈的线程是一个存储桶和limiter becomes non-pagable kernel memory的下降,尽管1Mb堆栈可以并且将被分页,导致系统慢速爬行。