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]


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


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(alle-gro @ 29.6.2009, 11:18) *
А вот как рулить линковщиком в Qt, можно ли там ему указать меньший размер стека?

ld --stack <size>
или
gcc -Wl,--stack=<size>

Вот только вопрос, наследуется ли размер стека для потоков.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alle-gro
  опции профиля:
сообщение 29.6.2009, 16:31
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(SABROG @ 29.6.2009, 11:41) *
Цитата(alle-gro @ 29.6.2009, 11:18) *
А вот как рулить линковщиком в Qt, можно ли там ему указать меньший размер стека?

ld --stack <size>
или
gcc -Wl,--stack=<size>

Вот только вопрос, наследуется ли размер стека для потоков.


А можно как-нибудь, через переменные среды или через файл проекта или через Qt Creator конфигурационные настройки задать эти параметры?(Не привычно через командгую строку компилять...)
А вообще, похоже дело дрянь, лучший, способ переписать приложение и воспользоваться советом создать пул потоков, которые будут разгребать очередь сообщений..... а мне то всего было нужно 2000 потоков ... :( и во неприятное прояснение ....
ну почему QThred - ов в Qt тольоко 1000 на процесс... везде писали что в в Винде можно по-умолчанию 2K иметь...

Цитата(AD @ 29.6.2009, 17:11) *
Цитата(alle-gro @ 29.6.2009, 17:03) *
А, ну это придирка ;) , ... Я как-то Qt рассматриваю, как одно целое, начиная с 4.5. Оно даже IDE свое стало иметь, а компилятор, линковщик, дебаггер у нее, для windows, например, тоже рекомендованные из mingw пакета.

впервые слышу. Это не придирка! Qt- средство для разработки GUI, для работы с потоками, XML и прочее. А как IDE ее нельзя рассматривать! Для этого есть MinGW, Qt Creator, Studio, в конце концов. Или же еще что-нибудь!

Точнее Qt - это кросс- платформенная библиотека классов (типа MFC), разве Вы не видите тенденцию ее превращения в IDE (Типа Delphi, Builder или VS). Я не спорю, что кому что нравится, кто Eclipse, кто VS, кто QDevelop, кто Qt Creator использует, как редакторы, компилятор и линковщик по-умолчанию из mingw для Windows (тоже можно сказать, что это уже де-факто...) И Все вмете это уже IDE, я вот, например, вообще не пользовался никогда командной строкой в Qt, правкой makefiles, запуском qmake -все это уже далется из среды...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




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