已调用C++中止
C++ abort has been called
我在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
处理程序中的所有线程,可以使代码安全。
相关文章:
- mesh.delete_face() 导致中止()
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- std::线程导致程序中止
- 在 CppUnit 中测试中止断言失败
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 检测到堆栈粉碎,中止,OpenGl 自由过剩
- 如何让递归 ASTVisitor 中止当前子树
- 双重释放或损坏(输出)和中止(核心转储)错误
- 使用flag、return、exception、goto或break中止过程
- 顺序中止后未触发 Qt 下载进度
- 编译器显示:中止调用
- OpenCV 在窗口关闭时中止(核心转储)
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- arm_data在第二次运行我的程序时中止失败,然后
- 如何实现,错误分配中止而不是抛出异常
- 有没有办法中止 cin 或 scanf
- 程序中止时自动关闭 boost::filtering_stream
- OpenMP 代码已中止
- QTreeView:如何中止选择更改