当前位置:  开发笔记 > 编程语言 > 正文

已经调用了C++ abort

如何解决《已经调用了C++abort》经验,为你挑选了1个好方法。

我在C++中进行多线程处理.我在Windows上.这就是我所拥有的:

int i;
    try {
        std::vector threads;
        for (i = 0; i < threadscount; i++) {
            threads.push_back(std::thread(myvoid));
            std::cout << "started\n";
        }

        for (i = 0; i < threadscount; i++) {
            threads[i].join();
            std::cout << "joined\n";
        }
    }
    catch (...) {} 

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

已经调用了abort().

为什么会这样?我能解决这个问题吗?



1> Richard Hodg..:

似乎在Windows上,限制是堆栈空间.如果减少给予每个线程的堆栈空间量,则可以增加线程数.

参考这里:

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

编辑:

刚刚在我的imac上敲了这个测试程序.在耗尽资源之前设法创建了2047个线程.你的旅费可能会改变 :-)

#include 
#include 
#include 
#include 
#include 


void myvoid()
{
    std::this_thread::sleep_for(std::chrono::seconds(5));
}

void start_thread(std::vector& 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 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
$

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有