• 9617阅读
  • 10回复

QThread 创建100个线程就可以,创建1000个就提示QThread::start: Failed to create thread [复制链接]

上一主题 下一主题
离线wangjiaooo
 

只看楼主 倒序阅读 楼主  发表于: 2016-07-05
这个问题困扰好几天了,请大牛们来看看。我先贴代码
按钮触发的槽:
void Amax_Test::testByStressSlot()
{
    SendRequestByParallel_Dialog srbp;
    Thread *pthread = NULL;
    if(srbp.exec() == QDialog::Accepted)
    {
        int numThread = srbp.numThread;  //线程数
        int numRequest = srbp.ui->numRequestByThreadSpinBox->value();  //每个线程发送请求数
        pthread = new Thread[numThread];
        for(int i = 0 ; i < numThread ; ++i )
        {
            pthread.set(numRequest);   //创建线程
            pthread.start();        //线程开始
        }
        for(int i = 0 ; i < numThread ; ++i )
        {
            pthread.wait();         //等待所有线程执行完成
        }
    }
    else
    {
        //点击取消需要处理情况
        goto exit;
    }
exit:
    if(pthread != NULL)
    {
        delete[] pthread;
        pthread = NULL;
    }
}


自己定义的Thread继承Qthread类。

#include "Thread.h"
#include "Amax_Test.h"
#include "ui_Amax_Test.h"
#include "common.h"
#include <QMutex>

/*Thread::Thread(unsigned int numRequest)
{
    this->numRequest = numRequest;
}
*/
void Thread::set(unsigned int num)
{
    this->numRequest = num;//每个线程需要发送的请求数
}

Thread::Thread(QThread *parent) :QThread(parent)
{

}

Thread::~Thread()
{

}

void Thread::run()
{
    QMap<QString, QString>g_m;
    QUrl url("http://192.168.3.62/pv?id=12345678911&pv=1&uv=0&pu=http://www.baidu.com&sys=3&ds=1920*1200&bid=213456&mid=123456&rnd=1232037192&ty=1&cl=http://www.baidu.com&mb=xiaomi");
    QNetworkRequest nr;
   // for(unsigned int i = 0 ; i < this->numRequest ;++i )
    //{
        do_get(url, nr, g_m);
    //}
}

而且想问一下,do_get方法这样写对吗?
bool do_get(QUrl url, QNetworkRequest nr, QMap<QString, QString> &m)
{
     nr.setUrl(url); //设置请求Url
     QNetworkAccessManager nam ;
     QNetworkReply *reply  = NULL;
     reply =  nam.get(nr);    //执行Get方法
     QEventLoop loop;
     QObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit()));   //以get方式发送数据
     loop.exec();
     m = finishReply(reply);
     reply->deleteLater();
     return true;
}



离线wangjiaooo

只看该作者 1楼 发表于: 2016-07-05
万分感谢。为什么创建1000个线程就不行呢?为什么100个就可以呢
离线sevencat

只看该作者 2楼 发表于: 2016-07-05
void QThread::setStackSize(uint stackSize);
这里用64K 64*1024再试试创建2000个线程。
战争就是和平,自由就是奴役,愚味就是力量
离线wangjiaooo

只看该作者 3楼 发表于: 2016-07-05
回 sevencat 的帖子
sevencat:void QThread::setStackSize(uint stackSize);
这里用64K 64*1024再试试创建2000个线程。 (2016-07-05 14:53) 

好的,我先试试,我也是第一次用QThread结合get提交。
离线wangjiaooo

只看该作者 4楼 发表于: 2016-07-05
回 sevencat 的帖子
sevencat:void QThread::setStackSize(uint stackSize);
这里用64K 64*1024再试试创建2000个线程。 (2016-07-05 14:53) 

我在run函数中只是写qDebug()<<this->currentThreadId()<<endl;这一行代码,没有问题。如果要是写    QMap<QString, QString>g_m;
    QUrl url("http://192.168.3.62/pv?id=12345678911&pv=1&uv=0&pu=http://www.baidu.com&sys=3&ds=1920*1200&bid=213456&mid=123456&rnd=1232037192&ty=1&cl=http://www.baidu.com&mb=xiaomi");
    QNetworkRequest nr;
    for(unsigned int i = 0 ; i < this->numRequest ;++i )
    {
        do_get(url, nr, g_m);
    }
创建1000个线程,刚开始的时候可以创建成功,之后又提示QThread::start: Failed to create thread。。
离线sevencat

只看该作者 5楼 发表于: 2016-07-05
1、试着使用64位
2、把stacksize慢慢加,128K,256K 512K...直到运行没问题。
战争就是和平,自由就是奴役,愚味就是力量
离线sevencat

只看该作者 6楼 发表于: 2016-07-05
可以试试异步http,你用的同步的需要很多线程。可以试试像libcurl的multi接口或者是
http://stackoverflow.com/questions/2251361/boost-asio-based-http-client-library-like-libcurl
像这里提到的一些异步库。
战争就是和平,自由就是奴役,愚味就是力量
离线sevencat

只看该作者 7楼 发表于: 2016-07-05
还有libserf这种。
战争就是和平,自由就是奴役,愚味就是力量
离线wangjiaooo

只看该作者 8楼 发表于: 2016-07-05
回 sevencat 的帖子
sevencat:还有libserf这种。 (2016-07-05 16:07) 

主要是想做用qt做一个压力测试的工具。
离线zhang2349

只看该作者 9楼 发表于: 2016-07-07
32位程序的内存不够这么多线程用
离线stlcours

只看该作者 10楼 发表于: 2016-07-07
WINDOWS操作系统中可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间

这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。

http://www.cnblogs.com/lancidie/archive/2011/12/15/2289337.html

但是据我观察,一个进程所能用的最大虚拟内存为1.47G,而且QT程序和Delphi都是如此,所以应该是普遍现象。这样说来,最多创建1400个左右的线程,不知道为什么你的程序1000个线程就崩溃了,这中间有400的差距,差距并不小,还希望严查。
1条评分金钱+10
boylebao 金钱 +10 - 2024-01-13
快速回复
限100 字节
 
上一个 下一个