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

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

Страниц: 1 ... 6 7 [8] 9 10 ... 13   Вниз
  Печать  
Автор Тема: К вопросу об организации взаимодействия пула производителей и одного потребителя  (Прочитано 61087 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #105 : Сентябрь 21, 2019, 11:29 »

Кстатии, boost::thread_pool, я там так и не увидел (может, плохо искал), как там понять, что все задачи выполнены..  Непонимающий 
В любую нормальную очередь мы передаем работу в виде функтора/лямбды. Никто не мешает передавать в ней callback-функцию, которая будет вызываться в конце работы. Так мы можем контролировать завершение каждой конкретной работы, а не всех вместе.
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #106 : Сентябрь 21, 2019, 11:52 »

Как без футуры то/флажков? Мне же нужно ждать ожидания/сигнала/отмашки, что ВСЕ задачи воркеры уже сделали, чтоб мне пойти потом на следующий круг..
Атомарный счетчик (по 20 копеек) - и вся любовь. Простое улучшение классической схемы (под специфику) - берем задачу (индекс) атомарным счетчиком (не извлекая ее при этом из очереди). И лишь когда все задачи завершены - уходим спать на мутекс. А в начале след раунда создаем всю новую очередь.

Кстатии, boost::thread_pool, я там так и не увидел (может, плохо искал), как там понять, что все задачи выполнены..  Непонимающий  
Я надыбал пример для 1.66, а у меня стоит 1.59. Переставлять "чревато" т.к. 1.59 используется в рабочих проектах. Ладно, погнал по хедерам. Хирак - не линкует. Пытался подлить еще хедеров - ни фига. Потом дошло - для pthread нужны либы. Правда их компиляция и добавление прошло с пол-пинка, но пока сообразишь...

Ладно, разбираюсь. Метод join всего лишь завершение ниток, если его просто так позвать - то висит и все. Оказывается сперва надо сделать closе (закрыть очередь). Но это всего лишь "закрыть пул", а удобного метода waitFotDone просто НЕТУ, пришлось сделать самому, псевдокод
Код
C++ (Qt)
// worker
void MyTask::operator()( void )
{
 ....
 if (--MyTask::taskCount <= 0) {
   std::unique_lock..
   MyTask::cond.notify_one();
 }
}
 
// main thread
MyTask::taskCount = tasks.size();
for (int i = 0; i < tasks.size(); ++i
pool.submit(tasks[i]);
 
while (MyTask::taskCount) {
std::unique_lock..
MyTask::cond.wait(lock);
}
На мелких задачах производительность также садится, но "запас прочности" побольше чем у QThreadPool. В принципе тул неплохой, но ни доки ни примеров - ни хрена нету  Плачущий Тратить время на разборки (да еще и с каждой версией) - непозволительная роскошь для профессионала.
« Последнее редактирование: Сентябрь 21, 2019, 11:54 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #107 : Сентябрь 21, 2019, 20:17 »

Цитировать
В любую нормальную очередь мы передаем работу в виде функтора/лямбды. Никто не мешает передавать в ней callback-функцию, которая будет вызываться в конце работы. Так мы можем контролировать завершение каждой конкретной работы, а не всех вместе.
Вот.. Я вначале тоже думал, что можно завести список флажков и передавать его в лямбду. Но.. Но это означает, что потребитель должен в "холостую" крутится в цикле, опрашивая каждый раз, не завершились ли все задачи.. Это немного напрягает.. Футура, на мой взгляд, здесь более логичное решение..

Цитировать
Начало: очевидно "число лифтов" - это у нас "число ядер". Уже тут должен сработать рефлекс типа "ой, что-то слишком гладко, не к добру"
Это почему же?

Цитировать
Позиция 2: а вот времена t1 и t2 - уже ягодки. Для задачи оптимизации они действительно необходимы, но как (или куда) воткнуть их в multi-threading?
Здесь особого секрета нет. Время t2 - это время когда нам нужно заблочить мьютекс, взять задачу, сделать pop у очереди и освободить мьютекс. Если Вы в очередь кидаете мульён мелких задач (у которых время выполнения сопостоаимо с описанной выше ситуацией) в один присяд, то Вы неменуемо свалитесь в пробку.

Цитировать
"Контрольный выстрел": и оказывается надо еще заранее иметь готовое аналитическое решение, а откуда его брать - хз.
Что значит откуда?
Мы же это уже обсуждали..  Там не нужно каких то фундаментальных теорий.. Я сейчас говорю, опираясь на обозначенную мной проблему.. В этой ситуации ответ очевиден:  нужно сделать очередь как можно меньше, а задачи, как можно более жирными.

Цитировать
а удобного метода waitFotDone просто НЕТУ
Вот, я как раз и хотел заиметь этод метод, и, как следствие, мой велик.. Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #108 : Сентябрь 21, 2019, 20:20 »

Так что там с реализацией на атомиках онли? Улыбающийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #109 : Сентябрь 21, 2019, 20:28 »

Цитировать
Оказывается сперва надо сделать closе (закрыть очередь).
На сколько я понимаю, это костыль в контекте моей проблемы..((
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #110 : Сентябрь 21, 2019, 20:37 »

Цитировать
Оказывается сперва надо сделать closе (закрыть очередь).
На сколько я понимаю, это костыль в контекте моей проблемы..((
Что за пул из буста вы обсуждаете, у которого есть метод close?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #111 : Сентябрь 21, 2019, 20:43 »

Цитировать
Что за пул из буста вы обсуждаете, у которого есть метод close?
Не знаю Улыбающийся Я имею в виду пул из asio)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #112 : Сентябрь 21, 2019, 20:45 »

Я уже плохо соображаю сейчас  Улыбающийся

Я хотел там найти, но не нашёл метода типа waitFotDone
« Последнее редактирование: Сентябрь 21, 2019, 20:46 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #113 : Сентябрь 21, 2019, 20:54 »

Цитировать
Оказывается сперва надо сделать closе (закрыть очередь).
На сколько я понимаю, это костыль в контекте моей проблемы..((
Что за пул из буста вы обсуждаете, у которого есть метод close?
А там и нет такого метода.. Поддался на мнения igors'а))
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #114 : Сентябрь 21, 2019, 21:17 »

Вот.. Я вначале тоже думал, что можно завести список флажков и передавать его в лямбду. Но.. Но это означает, что потребитель должен в "холостую" крутится в цикле, опрашивая каждый раз, не завершились ли все задачи.. Это немного напрягает.. Футура, на мой взгляд, здесь более логичное решение..
Вместо флажков можно было передавать std::promise, а полученные из него std::future использовать для ожидания.
Те же яйца только в профили. Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #115 : Сентябрь 21, 2019, 21:36 »

Цитировать
Вместо флажков можно было передавать std::promise, а полученные из него std::future использовать для ожидания.
Те же яйца только в профили.  Улыбающийся
Согласен) Но тем не менее это лишние Телодвижения) Которых хотелось бы избежать)
« Последнее редактирование: Сентябрь 21, 2019, 21:40 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #116 : Сентябрь 21, 2019, 21:38 »

Согласен) Но тем не менее это лишние целодвижения) Которых хотелось бы избежать)
Этот прием можно использовать, если пул сам не умеет в футуры. Улыбающийся
 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #117 : Сентябрь 21, 2019, 21:41 »

Цитировать
Этот прием можно использовать, если пул сам не умеет в футуры.  Улыбающийся
Согласен)) Но это всё же лишние телодвижения.. Я так делать не хочу(  Улыбающийся
« Последнее редактирование: Сентябрь 21, 2019, 21:52 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #118 : Сентябрь 22, 2019, 08:54 »

А там и нет такого метода..
Метод close есть
Код
C++ (Qt)
   /**
    * \b Effects: close the \c basic_thread_pool for submissions.
    * The worker threads will work until there is no more closures to run.
    */

   void close()
   {
     work_queue.close();
   }
 
Хедер в аттаче. А метода waitForDone (по аналогии с QThreadPool) нету о чем я Вам сообщил большими буквами.
Поддался на мнения igors'а))
А разве я Вас чем-то обманул?

Футура, на мой взгляд, здесь более логичное решение..
А у Вас здесь есть какой-то интерес к "именно этой/конкретной задаче" чтобы ее мониторить? Нет. Так зачем бездумно добавлять еще какие-то обертки/обвязки? Только потому что это "std" и, значит, "уже хорошо"?

Если атомарный счетчик вызывает у Вас затруднения (не знаю почему), то есть еще приемчик: пусть главная нитка работает как worker. Ведь босс тоже может делать какие-то задачи, не только раздавать их другим. При этом босс знает что "он босс" и может позаботиться об обновлении UI и.т.п.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #119 : Сентябрь 22, 2019, 09:12 »

А разве я Вас чем-то обманул?
Вы писали что попробовали бустовский пул. В бусте пул поток есть только в asio и это не то, что пробовали вы. У вас какая то библиотека не буста.

Если атомарный счетчик вызывает у Вас затруднения (не знаю почему)
Вам уже много раз говорили, что для организации эффективного ожидания атомарных счетчиков не достаточно.
Записан
Страниц: 1 ... 6 7 [8] 9 10 ... 13   Вверх
  Печать  
 
Перейти в:  


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