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

标签 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;
}

运行数千个循环后,程序捕获系统错误并输出:

...
3994
3995
3996
3997
3998
resource unavailable try again: resource unavailable try again

我知道可以同时运行的线程有最大数量,但在这种情况下,只有 8 个同时运行,之后它们就会被销毁。可以创建的总数是否有上限?

我尝试在 Linux 上使用 g++ 运行上面的代码,它运行良好,只有在 Windows(Visual Studio 和 mingw)上才会出现错误。有什么帮助吗? 谢谢。

最佳答案

通过了解如何在 Windows 上创建线程来最好地描述这里发生的情况。

每个线程在创建时都会被赋予一个 default 1Mb stack size 。您会注意到大约有 3998 个线程,这对应于大约 3.9Gb 的已用用户地址空间。这并非偶然,因为这对应于 64 位 Windows 下 32 位进程可用的大部分完整 4Gb 用户地址空间(内核空间为 64 位)。额外的空间是加载可执行文件和必要的系统 DLL 的地方。

通过将构建更改为 64 位,您已经大幅扩展了该地址空间。拥有 10000 个线程和 1Mb 堆栈只是九牛一毛,limiter becomes non-pagable kernel memory尽管 1Mb 堆栈可以并且将会被调出,导致系统速度慢得像爬行一样。

关于C++ 在循环中创建线程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315723/

相关文章:

c# - 我的 C# 应用程序出现全屏错误

c++ - 使用 C++11 在编译时以编程方式查找字节序

c++ - 寻找最短的字符串类型转换C++

c++ - 条件变量虚假唤醒/循环任务

java - 从 Runnable 重新抛出已检查的异常

java - 具有 FileReadingMessageSource 的 IntegrationFlows 对同一输入文件触发作业两次

.net - 默认的 netcore docker-compose 模板如何工作?

c# - 为什么 Copy if newer 不仅在输出目录中的文件较旧时替换?

c++ - 如何使函数的 LLVM IR 可用于我的程序?

c++ - 计算(64 位无符号整数)*(64 位无符号整数)除以 2^64 的商