Fedir
😂
Vlad
Всем привет Есть некоторый пул потоков, реализованный на основе вектора из thread Есть некоторая очередь с задачами Взаимодействие между ними налажено, всё более-менее работает На текущий момент поток ждёт notify_one, после чего хватает очередь, блокирует её, берёт задачу и разблокирует для дальшейших потоков, которые так же в состоянии ожидания Стоит задача: Нужно модернизировать систему так, чтобы число потоков было ограниченным (допустим, сделаю 4 потока, по ядру на каждый) и сделать балансировку задач, которые лежат в очереди, между потоками Мысли: Разделить количество задач между потоками (допустим, есть 12 задач, на каждый поток будет отводится по 3, соответственно). Для этого нужно либо завести на каждый поток свою очередь, куда закинуть задачи только для данного потока, либо как-то ещё. Отчего-то эта идея кажется плохой, но в голову другой не идёт. Помогите, пожалуйста, как это лучше спланировать. Вопрос: Как лучше поступить?
Fedir
concurent queue реализуй
Fedir
Когда один из потоков выполнил задачу, то сразу выхватывает следующую из очереди
Ostap ꑭ
Всем привет Есть некоторый пул потоков, реализованный на основе вектора из thread Есть некоторая очередь с задачами Взаимодействие между ними налажено, всё более-менее работает На текущий момент поток ждёт notify_one, после чего хватает очередь, блокирует её, берёт задачу и разблокирует для дальшейших потоков, которые так же в состоянии ожидания Стоит задача: Нужно модернизировать систему так, чтобы число потоков было ограниченным (допустим, сделаю 4 потока, по ядру на каждый) и сделать балансировку задач, которые лежат в очереди, между потоками Мысли: Разделить количество задач между потоками (допустим, есть 12 задач, на каждый поток будет отводится по 3, соответственно). Для этого нужно либо завести на каждый поток свою очередь, куда закинуть задачи только для данного потока, либо как-то ещё. Отчего-то эта идея кажется плохой, но в голову другой не идёт. Помогите, пожалуйста, как это лучше спланировать. Вопрос: Как лучше поступить?
https://github.com/cameron314/concurrentqueue
Ostap ꑭ
Вместо тысячи слов
Fedir
таки да
Vlad
Открыл заголовочник, стало страшно Я буду честен, хотя тут таких не любят - это задание, которое будет проверять преподаватель Система уже готова, нужно только в неё внести правки Т.е. реализовывать что-то с нуля - нет времени, хотя сейчас понимаю, что так было бы лучше Если вам не сложно, подскажите, пожалуйста, в какую сторону решения копать Если вдруг кто-то с таким сталкивался
Chebyrash
https://github.com/progschj/ThreadPool здесь просто идеальный код, смотри как работает конд_вар
Я правильно понимаю, что треды в С++ работают параллельно?
Ostap ꑭ
Как запрограммируешь
Ostap ꑭ
Но такого, как ГИЛ в питоне нету
Vlad
У меня реализация по этому же примеру, по нему делал свой пул. Переменные состояния тоже заюзал, т.е. поток, что ожидает - получает уведомление, что можно брать задачу, если ссылается на очередь (а на очередь этот сукин сын точно ссылается) Получается, нагрузка у меня и так балансируется?
Vlad
Чего же тогда преподу не понравилось)
Ostap ꑭ
Потому-что, очевидно, что большинство считает, что эффективно - это когда равное количество задач на каждый поток
Ostap ꑭ
Но это заблуждение
Ostap ꑭ
Как только поток освобождается - он захватывает новую задачу
Vlad
Я очень надеюсь завтра (ух ты ж ё, уже сегодня) ему это доказать. Спасибо, допилю пока отчёт, разжую все моменты.
Ostap ꑭ
Чтобы доказать, сделай элементарную функцию с числами Фибоначчи
Ostap ꑭ
И сделай замеры по времени
Ostap ꑭ
Нагружая очередь
Vlad
У меня умножение матрицы на матрицу, по блокам разбивал. Но на фибоначчи - да, проще будет. Так и сделаю.
Vlad
У меня обработка в очереди стоит на это дело. Тут в коде всё прозрачно, но само собой это только пул. Очередь отдельно пилил.
Ostap ꑭ
а если task() исключение бросит?)
Передать исключение в другой поток через move(), что мешает
Constantine
Передать исключение в другой поток через move(), что мешает
Я криво читаю, уже понял, там таска оборачивается
Constantine
Передать исключение в другой поток через move(), что мешает
Еще мне не нравится, что вот здесь не перемещение, но вроде-как-не-сломается https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h#L80
Constantine
Там конкретно не нравится, что по сути лишний shared_ptr остается в enqueue
blow
Ну что, спокойной ночи
Constantine
Там конкретно не нравится, что по сути лишний shared_ptr остается в enqueue
Это делает возможным очень странные случаи, когда enqueue оказывается последним владельцем для std::packaged_task
Stanislav
хм, господа, такой вопрос
Stanislav
а кто нибудь gitlab ci плотно юзает?
Stanislav
вопрос вот в чем, я его юзал и это было ок, но там были разные проекты и каждый под свою ос собирался, и тут задумался как единиым .gitlab-ci.yml собирать проект под винду и линукс
Stanislav
проблема вот в чем, там где ты пишешь скрипт ты пишешь либо bash либо cmd
Stanislav
и я не нашел в доках как это раскидать
Stanislav
мб можно два файла .yml сделать для разных воркеров, надо рыть
Stanislav
и причем тут енв? в cmd и шелле они по разному обрабатываются, можно словить ошибочку
Stanislav
это не совсем то
Кирилл
WSL?
Stanislav
WSL?
ну здрасьте, как тестить сборку под рхел? )
Кирилл
ну здрасьте, как тестить сборку под рхел? )
про рхел ничего не увидел, увидел только про линукс, без уточнения
Stanislav
про рхел ничего не увидел, увидел только про линукс, без уточнения
ну учитывая что там билды можно запускать на разных машинах где стоит билд воркер, поэтому не стал уточнять
Stanislav
вопрос то был как сделать так чтоб под виндой и линухом собиралось)
Stanislav
ладно, сам покопаю еще, или даже запатчу гитлаб
Aidar
как юзать coroutines2 с asio?
Aidar
я правильно думаю что примерно никак?
Stanislav
Полухин в одной из последних статей на хабре приводил пример coroutines + network
Aidar
можно ссылку?
Vladimir
Asio уже содержит корутины доки читай по asio srand
Aidar
Asio уже содержит корутины доки читай по asio srand
только на asio код превращается в javascript на колбеках
Aidar
я хотел этого избежать но coroutines1 deprecated
Eugene
@crackedmind, тут человеку поддержка нужна
Stanislav
нет человека, нет поддержки
Vladimir
Использование Boost.Asio с Coroutines TS https://habrahabr.ru/post/348602/
Aidar
Использование Boost.Asio с Coroutines TS https://habrahabr.ru/post/348602/
это отстой какойто по сравнению с coroutines2
Aidar
может я чото не понимаю но вижу уже 4 вида корутин
Aidar
кажись придется обернуть asio в корутины велосипедами
Aidar
кажись забью и заюзаю coroutines1
Aidar
эээ, это какие?
coroutines1, coroutines2, coroutinesTS, io_context от asio
Aidar
coroutines1 не входит в последнее потомучто deprecated
Stanislav
coroutines1, coroutines2, coroutinesTS, io_context от asio
шта? последнее то тут причем? и что такое coroutines1 и 2 я тоже не в курсе, помню что то было в бусте
Vladimir
это отстой какойто по сравнению с coroutines2
То что это вошло в TS уже показатель что это не отстой
Stanislav
То что это вошло в TS уже показатель что это не отстой
нам нужно больше диванных аналитиков
Aidar
То что это вошло в TS уже показатель что это не отстой
судя по статье слишком явно и не более чем кучка абстрактных ооп объектиков https://habrahabr.ru/post/348602/
Anonymous
нужен программист с++
Anonymous
допилить софт
Aidar
нужен программист с++
ты же понимаешь что неадекватно заходить и просить чтото сделать?
Aidar
даже за деньги
Stanislav
а как адекватно ?
"Объявления о вакансиях и новости по евентам - в лс @AlexFails."
Aidar
@AlexFails может канал фриланса? или в projobs?
Stanislav
читаем правила