crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Количество QThread потоков ограничено
alle-gro
  опции профиля:
сообщение 27.6.2009, 21:26
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 27.6.2009
Пользователь №: 859

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем,
столкнулся с неприятным явлением. Не могу получить больше чем 999 одновремено работающих потоков.
999 - это для потоков, которые не имеют очередь своих сообщений. Для потоков с очередью (тип exec()) - лимит 996.
От количества памяти на компьютере не зависит. Нашел статью, где говорится что в Windows можно открыть 2000 потоков на 1 процесс, почему в Qt в половину меньше, кто-нибудь знает ответ на этот вопрос?

Вот взял код и Qt примеров:
#include <QtCore>

#include <stdio.h>
#include <stdlib.h>

//! [0]
const int DataSize = 10;
const int BufferSize = 8192;

QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes;
//! [0]

//! [1]
class Producer : public QThread
//! [1] //! [2]
{
public:
    void run();
    Producer(){m_exit = false;}
    static int count;
    void stop(){m_exit = true;}
    bool m_exit;
};

int Producer::count = 0;

void Producer::run()
{
    
    //fprintf(stderr, "\n %p started", this);
    //QCoreApplication::processEvents();
    count ++;
    
    char buffer[BufferSize];
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
   // while (!m_exit) {
    //    msleep(1000);
        //fprintf(stderr, "%d", i);
        //freeBytes.acquire();
        //buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];
        //usedBytes.release();
   // }
   exec();
    fprintf(stderr, "\n%p finished", this);
    count --;
}
//! [2]

//! [3]
/*
class Consumer : public QThread
//! [3] //! [4]
{
public:
    void run();
};

void Consumer::run()
{
    for (int i = 0; i < DataSize; ++i) {
        usedBytes.acquire();
        fprintf(stderr, "%c", buffer[i % BufferSize]);
        freeBytes.release();
    }
    fprintf(stderr, "\n");
}
//! [4]
*/
//! [5]
#define THREAD_LIMIT 1100


int main(int argc, char *argv[])
//! [5] //! [6]
{
    QCoreApplication app(argc, argv);
    Producer *producer = new Producer[THREAD_LIMIT];
    //Consumer* consumer = new Consumer[1000];
    for(int i=0;i< THREAD_LIMIT; i++) {
        //producer[i].setStackSize (1* 100 );
        producer[i].start();

       }

    //consumer.start();
    quint64 k=0;
    while((Producer::count < THREAD_LIMIT)&& (k++ < 10000000)) {

        QCoreApplication::processEvents();
       }
        
    fprintf(stderr, "\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %d\n", Producer::count);

    //consumer.wait();
    //for(int i=0;i< THREAD_LIMIT; i++) {
    //    producer[i].stop();
       //}
       
       for(int i=0;i< THREAD_LIMIT; i++) {
       producer[i].quit();
   }
       for(int i=0;i< THREAD_LIMIT; i++) {
        producer[i].wait();
   }
       fprintf(stderr, "\n ----------------------------------------- %d\n", Producer::count);
    delete[]  producer;
    return 0;
}
//! [6]


Не осуждайте за грязь, просто важен сам факт наличия ограничения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 28.6.2009, 10:47
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(alle-gro @ 27.6.2009, 23:19) *
Здесь говорится, что в Linux- е можно как-то уменьшить размер стэка на поток, а вот что с Windows?
В видовс тоже можно, только это делается в реестре.
Смотри по ссылке выше, приведенной Litkevich Yuriy, мой 2 пост.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 3:32