已调用C++中止

C++ abort has been called

本文关键字:中止 C++ 调用      更新时间:2023-10-16

我在C++中执行多线程。我在Windows上。这就是我所拥有的:

int i;
    try {
        std::vector<std::thread> threads;
        for (i = 0; i < threadscount; i++) {
            threads.push_back(std::thread(myvoid));
            std::cout << "startedn";
        }
        for (i = 0; i < threadscount; i++) {
            threads[i].join();
            std::cout << "joinedn";
        }
    }
    catch (...) {} 

但当我将threadscount设置为2000个线程时,我得到:

已调用abort()。

为什么会发生这种情况?我能找到解决方案吗?

在windows上,限制似乎是堆栈空间。如果减少每个线程的堆栈空间,则可以增加线程数。

此处参考:

https://blogs.msdn.microsoft.com/oldnewthing/20050729-14/?p=34773/

编辑:

刚刚在我的imac上搞砸了这个测试程序。设法在资源耗尽之前创建了2047个线程。您的里程数可能有所不同:-)

#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>
#include <vector>

void myvoid()
{
    std::this_thread::sleep_for(std::chrono::seconds(5));
}
void start_thread(std::vector<std::thread>& threads)
{
    try
    {
        threads.push_back(std::thread(myvoid));
        std::cout << "started " << threads.size() <<"n";
    }
    catch(...) {
        std::cout << "failed to start at " << threads.size() + 1 << "n";
        throw;
    }
}
auto main() -> int
{
    std::vector<std::thread> threads;
    try {
        for(;;)
            start_thread(threads);
    }
    catch(...)
    {
    }
    for (auto& t : threads) {
        if (t.joinable()) {
            t.join();
        }
    }
    return 0;
}

样本输出:

...
started 2042
started 2043
started 2044
started 2045
started 2046
started 2047
failed to start at 2048
$

因为没有人能够期望启动2000个线程。您的计算机没有用于此操作的资源。

对此有一个简单的解决方案——使用合理数量的线程。提示-任何超过50的人都可能是精神错乱,除非你有非常特殊的情况。

如果系统在尝试创建所有这些线程时耗尽了资源,那么此行可能会引发异常:

        threads.push_back(std::thread(myvoid));

这将破坏向量threads,然后它将调用std::terminate(),因为它破坏了可连接的std::thread

通过将threads的声明移动到try块之前,然后确保连接(或分离)catch处理程序中的所有线程,可以使代码安全。