Russian Qt Forum
Ноябрь 22, 2024, 16:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Развить пример  (Прочитано 5566 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 07, 2016, 10:43 »

Добрый день

В соседней теме рассматривается этот пример http://doc.qt.io/qt-5/qthread.html#details, в котором предлагается цивильный способ "выноса операции в поток". Впрочем и простецкое наследование от QThread не осуждается, идет следующим примером. Обсуждение получилось довольно "академическое", типа "а чего это сигнал public, это же небезопасно!". Тут хотелось бы поговорить о другом

Да, так мы умеем "выносить", но что если "выносимых" две или больше или вообще они идут мутным потоком? Их можно свалить одному контроллеру, но так (в среднем) задействуется лишь одно ядро, операции будут ждать. Плодить контроллеры явно не хочется, а QtConcurrent не в масть. Что бы Вы предложили?

Спасибо
Записан
_OLEGator_
Гость
« Ответ #1 : Июнь 07, 2016, 11:03 »

Использовать QThreadPool.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июнь 08, 2016, 14:45 »

Допустим, у нас задачи сыпятся в общую очередь. Тогда.
I. Как раз таки конкурент в масть. Контроллер обрабатывает новую задачу, создаёт футуру, вешает на неё вотчера. Вотчеров можно создать заранее (по кол-ву тредов) и сделать очередь футур, к-ую разгребают свободные вотчеры. Это если не хочется аллоцировать вотчеров.
II. Несколько тредов, к-ые крутят эвентлуп, в каждом живёт воркер. Все воркеры подсоединены к сигналу контроллера естьРабота(). При появлении задачи мы просто кладем ее в очередь, эмитим сигнал. Первый свободный вотчер "успеет" схватить задачу, остальные сработают вхолостую. По сути тоже, что I, только вместо спящих на QWaitCondition тредах в пуле мы крутим всегда эвентлупы (и спим на select'е).
Записан
rudireg
Гость
« Ответ #3 : Ноябрь 02, 2016, 20:46 »

Добрый день

В соседней теме рассматривается этот пример http://doc.qt.io/qt-5/qthread.html#details, в котором предлагается цивильный способ "выноса операции в поток". Впрочем и простецкое наследование от QThread не осуждается, идет следующим примером. Обсуждение получилось довольно "академическое", типа "а чего это сигнал public, это же небезопасно!". Тут хотелось бы поговорить о другом

Да, так мы умеем "выносить", но что если "выносимых" две или больше или вообще они идут мутным потоком? Их можно свалить одному контроллеру, но так (в среднем) задействуется лишь одно ядро, операции будут ждать. Плодить контроллеры явно не хочется, а QtConcurrent не в масть. Что бы Вы предложили?

Спасибо

А почему
Цитировать
задействуется лишь одно ядро
-  если мы сделаем moveToThread ? Разве слоты перенесенного QObject в подобном случае не должны выполнятся в другой нитке?
« Последнее редактирование: Ноябрь 02, 2016, 20:48 от rudireg » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Ноябрь 03, 2016, 06:21 »

rudireg, отдельный поток не гарантирует отдельное ядро процессора
Записан

Юра.
rudireg
Гость
« Ответ #5 : Ноябрь 03, 2016, 08:52 »

rudireg, отдельный поток не гарантирует отдельное ядро процессора
А можно ли средствами QT назначать нитки разным ядрам?
Я всегда думал что ОС берет на себя функции распределения.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 03, 2016, 09:15 »

А можно ли средствами QT назначать нитки разным ядрам?
Нет, такая фишка есть у интела и то не для всех платформ.
Я всегда думал что ОС берет на себя функции распределения.
Да, берет, Напр 2 нитки считают - ОС автоматом будет им выделять кванты времени на тех ядрах что сочтет нужным. Если в это время активны еще приложения - им тоже выделится время. Но "кормить" нитки (т.е. давать им задачи и пускать на выполнение) - забота не ОС, а программиста
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.116 секунд. Запросов: 22.