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]


Не осуждайте за грязь, просто важен сам факт наличия ограничения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
Litkevich Yuriy
  опции профиля:
сообщение 27.6.2009, 22:02
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


alle-gro, почитай вот эту тему: Boost thread - ограниченное количество потоков?, непонятное ограничение, не связанное с ресурсами системы
Там довольно основательное иследование.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alle-gro
  опции профиля:
сообщение 27.6.2009, 22:19
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 27.6.2009, 23:02) *
alle-gro, почитай вот эту тему: Boost thread - ограниченное количество потоков?, непонятное ограничение, не связанное с ресурсами системы
Там довольно основательное иследование.


Да, спасибо за ссылку, однако, нашел там подтверджение тому, что уже видел.
Действительно кол-во потоков зависит от размера стэка для каждого потока, по-умолчанию в windows 1M.
Тогда, используя функцию setStackSize(), по-идее, я должен бы получить хоть какой-то результат. Но уменьшение стэка в Windows ни
к чему не привело. Здесь говорится, что в Linux- е можно как-то уменьшить размер стэка на поток, а вот что с Windows?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.6.2009, 10:47
Сообщение #4


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

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

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




Репутация:   40  


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


Новичок


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

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




Репутация:   0  


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

Да, большое спасибо, вижу, проверю, доложу о результатах :clapping:

Цитата(ViGOur @ 28.6.2009, 11:47) *
В видовс тоже можно, только это делается в реестре.
Смотри по ссылке выше, приведенной Litkevich Yuriy, мой 2 пост.

Перечитал еще раз утверждение, получается, что размером сека потока рулит только линковщик, через реестр другими величинами рулят.
Все сказанное в статье относится к VS.
А вот как рулить линковщиком в Qt, можно ли там ему указать меньший размер стека?
Думаю тот факт, что для VS рапортуют 2000 потоков, а в Qt это число 1000 и указывет, что default значение размера сека в Qt в 2 раза больше, выделяется, чем у VS проекта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.6.2009, 10:30
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(alle-gro @ 29.6.2009, 14:18) *
линковщиком в Qt,
а в Qt нет линковщика.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 29.6.2009, 10:41
Сообщение #7


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

Группа: Участник
Сообщений: 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, 15:39
Сообщение #8


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.6.2009, 11:30) *
Цитата(alle-gro @ 29.6.2009, 14:18) *
линковщиком в Qt,
а в Qt нет линковщика.

Не верю, не думаю, что Qt что то новое изобрели, это кто ж из obj файлов сшивает приложение, адреса функций раздает и.т.д ...
вот смотрю в make файл и вижу LINK = g++, что-то мне подсказывает, что это линкощик....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 29.6.2009, 15:50
Сообщение #9


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(alle-gro @ 29.6.2009, 16:39) *
Не верю, не думаю, что Qt что то новое изобрели, это кто ж из obj файлов сшивает приложение, адреса функций раздает и.т.д ...
вот смотрю в make файл и вижу LINK = g++, что-то мне подсказывает, что это линкощик....

:) Да, отдельно поставляемый компилятор. Например, из MINGW, или же из CYGWIN! Или вообще отдельный: g++, gcc, link, gdb!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alle-gro
  опции профиля:
сообщение 29.6.2009, 16:03
Сообщение #10


Новичок


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

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




Репутация:   0  


Цитата(AD @ 29.6.2009, 16:50) *
:) Да, отдельно поставляемый компилятор. Например, из MINGW, или же из CYGWIN! Или вообще отдельный: g++, gcc, link, gdb!

А, ну это придирка ;) , ... Я как-то Qt рассматриваю, как одно целое, начиная с 4.5. Оно даже IDE свое стало иметь, а компилятор, линковщик, дебаггер у нее, для windows, например, тоже рекомендованные из mingw пакета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 13:00