gpt4 book ai didi

c++ - 为什么 _beginthreadex 因 ERROR_INVALID_ACCESS 而失败?

转载 作者:行者123 更新时间:2023-11-27 23:08:39 26 4
gpt4 key购买 nike

我有一堆 QWebViews 渲染到一个小部件上。有一点我开始收到错误 QThread::start: Failed to create thread (The access code is invalid.)。查看 Qt 源代码,似乎 _beginthreadex 正在返回一个空句柄,而 errno 是 ERROR_INVALID_ACCESS,但我不知道为什么。

这是错误打印时的回溯:

0   qErrnoWarning                           qglobal.cpp    2451    0x69ccdd3c  1   QThread::start                          qthread_win.cpp 469 0x69cd5831  2   QThreadPoolPrivate::tryStart            qthreadpool.cpp 203 0x69ccc3f5  3   QThreadPool::start                      qthreadpool.cpp 474 0x69cccdf4  4   QHostInfoLookupManager::work            qhostinfo.cpp   633 0x6cb9b071  5   QHostInfoLookupManager::scheduleLookup  qhostinfo.cpp   652 0x6cb9b143  6   QHostInfo::lookupHost                   qhostinfo.cpp   202 0x6cb9a220  7   qt_qhostinfo_lookup                     qhostinfo.cpp   722 0x6cb9b4b6  8   QAbstractSocket::connectToHostImplementation    qabstractsocket.cpp 1427    0x6cbb17f5  9   QAbstractSocket::qt_static_metacall     moc_qabstractsocket.cpp 166 0x6cbb4925  10  QMetaMethod::invoke                     qmetaobject.cpp 1664    0x69dc784f  11  QMetaObject::invokeMethod               qmetaobject.cpp 1179    0x69dc6d6b  12  QMetaObject::invokeMethod               qobjectdefs.h   418 0x6cd361dd  13  QAbstractSocket::connectToHost          qabstractsocket.cpp 1342    0x6cbb13b3  14  QSslSocket::connectToHostImplementation qsslsocket.cpp  1744    0x6cbc7340  15  QSslSocket::qt_static_metacall          moc_qsslsocket.cpp  91  0x6cbc93cf  16  QMetaMethod::invoke                     qmetaobject.cpp 1664    0x69dc784f  17  QMetaObject::invokeMethod               qmetaobject.cpp 1179    0x69dc6d6b  18  QMetaObject::invokeMethod               qobjectdefs.h   418 0x6cd361dd  19  QAbstractSocket::connectToHost          qabstractsocket.cpp 1342    0x6cbb13b3  20  QSslSocket::connectToHostEncrypted      qsslsocket.cpp  422 0x6cbc55e1  21  QHttpNetworkConnectionChannel::ensureConnection qhttpnetworkconnectionchannel.cpp   607 0x6cb6191f  22  QHttpNetworkConnectionPrivate::_q_startNextRequest  qhttpnetworkconnection.cpp  862 0x6cb5e92c  23  QHttpNetworkConnectionPrivate::queueRequest qhttpnetworkconnection.cpp  501 0x6cb5c57d  24  QHttpNetworkConnection::sendRequest     qhttpnetworkconnection.cpp  931 0x6cb5edf2  25  QHttpThreadDelegate::startRequest       qhttpthreaddelegate.cpp 291 0x6cb8912a  26  QHttpThreadDelegate::qt_static_metacall moc_qhttpthreaddelegate_p.cpp   113 0x6cbd147c  27  QMetaCallEvent::placeMetaCall           qobject.cpp 525 0x69dcf91c  28  QObject::event                          qobject.cpp 1195    0x69dd08db  29  QApplicationPrivate::notify_helper      qapplication.cpp    4551    0x2582f44   30  QApplication::notify                    qapplication.cpp    3933    0x25808b7   31  QCoreApplication::notifyInternal        qcoreapplication.cpp    915 0x69dc0dc6  32  QCoreApplication::sendEvent             qcoreapplication.h  231 0x69e35185  33  QCoreApplicationPrivate::sendPostedEvents   qcoreapplication.cpp    1539    0x69dc1d2a  34  qt_internal_proc                        qeventdispatcher_win.cpp    496 0x69de2590  35  USER32!OffsetRect                       C:\Windows\syswow64\user32.dll  0   0x74cc62fa  36  ??      0   0x152404    37  ??      0   0x401   38  ??      0       

The code at the call looks like:

d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start, //d->stackSize is 0
this, CREATE_SUSPENDED, &(d->id));

if (!d->handle) {
qErrnoWarning(errno, "QThread::start: Failed to create thread");
d->running = false;
d->finished = true;
return;
}

为什么会发生这种情况,我该如何解决?

编辑:同样值得注意的是,在中断点正好有 500 个线程。

最佳答案

创建 500 个线程后,很有可能您的进程(用于线程堆栈)中的可用地址空间已用完。在 32 位 Windows 上,进程默认只能获得 2GB 的地址空间(地址空间的上半部分为内核保留)。 500 个 1MB 线程堆栈(默认大小,Qt 可能会更高或更低)加上您的进程进行的所有其他分配很容易用完。

参见 this Old New Thing article了解更多。

可能的修复:

  1. 如果您知道您的 QThread 不需要很大的堆栈,您可以在启动线程之前调用 QThread::setStackSize() 来设置较小的堆栈。
  2. 考虑使用线程池和/或只减少启动的并发线程数。您不太可能拥有足够的 CPU 核心来使 500 多个线程高效运行。
  3. 使用 Windows/3GB 开关并使您的应用程序 LARGE ADDRESS AWARE获得 3GB 的用户模式地址空间。
  4. 转到 64 位(用于 63 位用户模式地址空间)。

关于c++ - 为什么 _beginthreadex 因 ERROR_INVALID_ACCESS 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com