C ++在循环中创建线程时出错

时间:2017-02-18 13:24:13

标签: c++ multithreading visual-studio

在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)上运行它才能发生错误。有帮助吗? 感谢。

1 个答案:

答案 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堆栈可以并且将被分页,导致系统慢速爬行。