1. C++ / Говнокод #19987

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    template <typename T, typename ...Args>
    std::future<T> looped_thread::add_task(std::function<T(Args...)> func, Args ...args) {
        std::packaged_task<T()> task(std::bind(func,args...));
        std::future<T> fut = task.get_future();
        std::lock_guard<std::mutex> lock(_mutex);
        /*std::queue<std::function<void()>>*/ _tasks.push(/*std::packaged_task<T()> -> std::function<void()> ??*/);
        /*std::condition_variable*/ _cv.notify_one(); 
        return std::move(fut);
    }

    Задача: написать собственный пул потоков с блекджеком и шлюхами
    Подзадача: реализовать метод, добавляющий функтор в очередь команд и возвращающий std::future
    Что не так: std::packaged_task не конвертируется в std::future. Он не копируется, а поэтому:
    а. его нельзя передать через std::bind;
    б. при захвате через с++14 lambda capture expressions (аля

    auto f = [t = std::move(task)](){/**/};
    ) мы получаем t типа const std::packaged_task (мб это особенность mingw, конечно, но один фиг работать должно везде). Ни выполнить, ни мувнуть, ни скопировать. mutable в спецификации лямбды не помогает
    в. Примерно все те же самые проблемы возникают при попытке обернуть packaged_task в unique_ptr
    г. если чуть-чуть погуглить, можно найти кучу страшных решений через виртуальные методы, наследование, оборачивание packaged_task в shared_ptr и пр. Например: https://rsdn.ru/forum/cpp/5824551.all

    Но есть куда более простое и изящное решение. Угадаете?

    Запостил: Antervis, 12 Мая 2016

    Комментарии (67) RSS

    • > Но есть куда более простое и изящное решение. Угадаете?

      все перепесать на жабе + спринг? угадал?
      Ответить
    • Использовать свежий Boost.Asio и не писать свой thread pool?
      Ответить
      • цель малех другая. Скажем, я хочу, чтобы задачи A B C D E F выполнялись так, чтобы A, D, F выполнялись последовательно в одном потоке, B C - в другом, а E - в третьем.
        Ответить
        • Т.е. ты хочешь привязать задачи к конкретным тредам? Какой-же это тогда тред-пул? Ну и страйды в помощь.

          Если задачки чисто вычислительные, рекомендую tbb.

          Если просто разбить несколько задачек по тредам - std::async.
          Ответить
          • идея как раз в том, чтобы сделать что-то типа async'а, при этом указывая в каком именно потоке будет выполняться задача.
            Ответить
            • вот это дырень в абстракции! дырень так дырень!

              Использовать async и при этом думать в каком именно потоке что-то там выполнится, это как писать на JavaScript и думать в какой именно строке какого банка памяти контроллер разместит твою переменную
              Ответить
              • что лучше: не париться по поводу очередности/потока исполнения задач, синхронизируя все общие ресурсы и обходя возможные дедлоки, или сгруппировать задачи по используемым ресурсам, избавляясь от 90% примитивов синхронизации?
                Ответить
                • Юзать boost::asio, не париться по поводу очерёдности/потока исполнения задач и избавиться от 90% примитивов синхронизации.
                  Ответить
                  • ты обычная онскильная кукарекалка, коиорая нихрена не неси херню, питух. не понимает ф том, о яём кукарекалка, воторая нихрена не неси херню, питух. не неси херню, питух. иди почитай, питух. не неси херню, питух. не понимает в том, о чём кукареколка,
                    Ответить
                • привет, друг
                  дам тебе бесплатный совет
                  если ты серьезно упорол упёрся в железо и ожидание блокировок действительно узкое место (что обычно не очень типично, но всё же), то делай свой менеджер потоков, ресурсов, следи за утечками, пиши неблокирующиеся очереди, графы зависимостей, выжимай из бездушной машины последние 5%, так её!

                  но если же нет, то нет!

                  берёшь асио, доверяешь ему разруливание 1000 потоков, он отлично работает даже на говне на 400 мгц, ты уже выбрал с++, который не тормозит как жаба, сраный мутекс это повседневная необходимость, надёжность ПО не пустой звук, мутексы они ведь и в шаредптр тоже внутри, в каждом, пиво само себя не выпьет - сделал, работает быстро и с первого раза, не надо нихера дебажить, ничего не течет, науку ты не продвинешь этим - моник выключил и идёшь спокойно домой

                  одумайся
                  Ответить
                  • > мутексы
                    Ну раз он уже разбил таски по ресурсам, вроде можно и без мутексов - запилить по страйду на группу и вперёд...
                    Ответить
                    • страйд?
                      уже второй раз вижу в треде
                      знаю странд

                      а страйд...
                      гугл говорит
                      Страйд плюс для собак (Stride Plus) жидкий во флаконе. Натуральный препарат, сохраняющий подвижность суставов.
                      согласен, может помочь
                      Ответить
                      • Почему-то я всегда обзываю strand'ы страйдами :)
                        Ответить
                        • кстати, лень смотреть исходник (и качать), но странд очень даже внутри себя мутекс держит (и чуть ли не очередь)
                          собсно, об этом мой большой спич наверху

                          не надо ссать доверять чужим библиотекам, которые неплохо решают твои задачи универсальным способом
                          гнать велосипед надо только в случае крайней нужды (ну или если нашёл фатальный недостаток, тоже годная причина)
                          Ответить
                          • фатальный недостаток и велосипед - это одно и то же. Кэп.
                            Ответить
                          • Рукописный тредпул самый быстрый в мире, и по определению не может быть медленней бустового, ибо был бы ты не глупым питухом и знал бы, как работает твой буст - ты бы полнял, что как тредпул для твоего ГЦ она юзает мутексы.

                            Т.е. твой буст-асио - это пул над очередью с мьютексом, который по определению быстрее быть не может.
                            Ответить
                    • Он считает от реализации, а не от абстракции, питух, ибо только анскильные животные, которые не знают низов пытаются низы свести к примитивным абстракциям.
                      Ответить
                      • Генератор дочитал ГК до Царя. Все в убежище.
                        Ответить
                  • > мутексы они ведь и в шаредптр тоже внутри, в каждом

                    ну так то атомарный счетчик и мьютекс это маленько разные вещи
                    Ответить
                  • ты споришь хорошо и логично, но не с тем, что я пытаюсь донести.
                    Вариант 1: раскидываем евенты по потокам случайно. Тогда любой ресурс, который используется в более чем одном евенте (читай "в более чем одной функции"), становится разделяемым и его нужно оборачивать блокирующими примитивами.
                    Вариант 2: раскидываем евенты по потокам в соответствии с используемыми ресурсами. Тогда, количество ресурсов, о распределении которых надо беспокоиться, на порядки ниже. Можно вообще обойтись лишь теми, которые скрыты в реализации очереди команд.

                    Дело вообще не в быстродействии (хотя, конечно, хочется чтобы базовые вещи работали побыстрее). А в том, что велосипед размером в один 100-строчный хедер уменьшает общее количество синхронизирующих примитивов в системе в несколько раз.
                    Ответить
                  • Ты можешь заюзать Boost.Asio - и управление вернёт в момент, даже на питух asio и даже, если 10потоков пишешь.

                    Как это будешь делать ты, я жду, причем это должно быть лучше по производительностино я понимаю, что ты анскильный питух - сделай хотябы так же, пожалуйста.

                    Причем заметь - я могу дампить любые задачи в памяти - даже фьючеры и прочее.
                    Ответить
                  • >выжимай из бездушной машины последние 5%, так её!

                    Никто из питушков, не напишет тредпул оптимальней, чем Царь. Царям не надо знать питушарский boost - они не питухи типа тебя. Я понимаю как работает этот мир - создать произвольный тредпул для Царя не составляет труда.

                    Цари пишут предельный код для х86.
                    Понимаешь ещё в чём штука, если я сразу напишу на птхреад - пацаны мне скажут "ну на птхреад естественно будет быстрее - но у нас нет птхреад, у нас есть пару стоек с нехалемами - мы на них и считаем", причем пацаны именно так и говорят. Поэтому первоначальная моя цель - слить лалок, а уж потом я пойду, куплю вореций и буду на них считать.
                    Ответить
                  • > ты уже выбрал с++
                    Плюсовик - животное. Тратят что-то бессмысленно только питухи, будь-то такты, строки, память и прочее. Писать код, не думая об анскилледах.
                    Ответить
                    • вот хорошо человеку, вечер пятницы, он уже накидался
                      а нам ещё батрачить до заката электрического солнца, и завтра тоже...
                      Ответить
                • >Задача: написать собственный пул потоков

                  Не слушай никого - пиши предельный код для штеуда.

                  Чтобы слил буст в хламину. Пул работает примерно за 2мютекса, дальше уже уперается в память.
                  Разбирацся в устройстве железа. Знание матчасти даёт буст не соизмеримый с той питушнёй для заедушных крестовиков.
                  Ответить
            • "идея как раз в том, чтобы сделать что-то типа async'а, при этом указывая в каком именно потоке будет выполняться задача."

              изврат. тебе просто нужны зависимости между задачами? так почему бы именно это и не реализовывать?
              Ответить
              • можно поподробнее?
                Ответить
                • оригинал:

                  "Скажем, я хочу, чтобы задачи A B C D E F выполнялись так, чтобы A, D, F выполнялись последовательно в одном потоке, B C - в другом, а E - в третьем."

                  ну это же как и в билд системах:

                  A depends on D
                  D depends on F

                  если ты хочешь выполнить А, то тебе сначала надо сделать D. но что бы сделать D, тебе нужно сделать F. (edit1: гыгы, порядок все таки перепутал.)

                  задаешь зависимости задач. делаешь из них граф. из графа вытягиваешь задачи у которых нет зависимостей/зависимости были удовлетворены - и эти задачи выполняешь.

                  если тебе очень сильно надо что бы все зависимости делались в одном и том же потоке (очень сильно сомневаюсь что надо), то вводишь аффинити ( https://en.wikipedia.org/wiki/Processor_affinity ) и скедулишь еще в добавок по аффинити: если F делалось в потоке №123, то D должно делаться в том же потоке.
                  Ответить
                  • То ли ты забыл выделить текст зеленым, то ли всерьез предлагаешь вариант решения задачи, который сложнее моего...
                    Ответить
                    • не настолько он и сложен. я пару раз уже делал на крестах и на с.

                      знаю что у джавистов даже есть какая-то либа для воркфлоу автоматизации которая это умеет (jbmp? или что-то в этом духе).

                      удивит если для крестов тоже чего подобного уже не наваяли. задача достаточно типичная. (смотри какие древние сети петри.)
                      Ответить
                      • > jbmp
                        бебебе?
                        так BPM (бузинес-процесс менедежемент есличо) системы и одну из жавоёбских либ для оных (jBPM) ещё никто не называл
                        Ответить
            • То, что ты хочешь сделать, называется thread confinement. Отличный метод, используется в Chromium, например, я тоже так часто делаю.
              Только обычно я скрываю такие подробности от клиентов ресурсов: есть простой интерфейс, операции возвращают фьючерсы, а внутри поток с очередью задач, огороженный pimpl-ом.
              Ответить
              • А для сишарпика и других языков с аналогами await такое есть?
                Ответить
    • std::future<T> fut = task.get_future();
      std::lock_guard<std::mutex> lock(_mutex);
      
      --->
      
      std::fu
             ck_guard
      Ответить
    • > мы получаем t типа const std::packaged_task (мб это особенность mingw, конечно, но один фиг работать должно везде)
      Это особенность сипласплас. Оператор "скобки" у лямбды по-умолчанию константный. Если хочешь мутировать захваченные переменные, то лямбда должна быть mutable: []() mutable {}
      Ответить
      • >mutable в спецификации лямбды не помогает
        Ответить
      • auto f = [t = std::move(task)]() mutable { t(); }

        полностью валидный функциональный объект. С одним НО!: он вообще никак не кастится в std::function<void()>.
        Ответить
        • Так что в итоге за изящное решение?
          Ответить
          • auto task = new std::packaged_task<T()>(std::bind(func,args...));
            _tasks.push([task](){
                (*task)();
                delete task;
            });

            передать по raw указателю
            Ответить
            • ............................................________
              ....................................,.-'"...................``~.,
              .............................,.-"..................................."-.,
              .........................,/...............................................":,
              .....................,?......................................................,
              .................../...........................................................,}
              ................./......................................................,:`^`..}
              .............../...................................................,:"........./
              ..............?.....__.........................................:`.........../
              ............./__.(....."~-,_..............................,:`........../
              .........../(_...."~,_........"~,_....................,:`........_/
              ..........{.._$;_......"=,_......."-,_.......,.-~-,},.~";/....}
              ...........((.....*~_......."=-._......";,,./`..../"............../
              ...,,,___.`~,......"~.,....................`.....}............../
              ............(....`=-,,.......`........................(......;_,,-"
              ............/.`~,......`-...................................../
              .............`~.*-,.....................................|,./.....,__
              ,,_..........}.>-._...................................|..............`=~-,
              .....`=~-,__......`,.................................
              ...................`=~-,,.,...............................
              ................................`:,,...........................`..............__
              .....................................`=-,...................,%`>--==``
              ........................................_..........._,-%.......`
              ...................................,
              Ответить
            • > передать по raw указателю
              Родина дала им абстракции... Абстрагируйся, абстрагируйся от деталей! Блядь, не хочу, хочу жрать говно... Это программисты? Это программисты?! Новыми крестами обмазались, память ебут... Пидоры, блять, ебанные...
              Ответить
    • std::function говно, не позволяет биндить без копирования, это пиздец, если подумать, я свой велосипед из-за этого писал, например, охуенно изящно, да
      Ответить
      • Не просто так же std::unique_function предлагают: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0288r0.pdf

        по факту, биндануть noncopyable объект можно:
        auto f = std::bind([](non_copy_t &obj){ /*  */}, std::move(obj));

        На практике его можно вызвать или мувнуть. Но это всё id
        Ответить
        • > по факту, биндануть noncopyable объект можно:
          Ээээ мувануть и передать по неконстантной ссылке? Это ок?
          Ответить
          • std::ref
            std::cref
            http://ideone.com/KPInUc
            Ответить
            • через ref пробовал, объект удаляется при выходе из контекста и ссылка остается некорректной
              Ответить
          • грязный хак, но это работает: http://ideone.com/yUiLGx
            bind куда-то себе внутрь сохраняет значение, переданное через move, и от него уже берет ссылку. И надо постараться, чтобы такой bind-объект умер раньше, чем выполнится вложенная функция
            Ответить
        • Я называю вас типа тебя питухом, захрена не доросли ещё до уровня Царя. Свою криволапость, которая оправдываёт свою криволапость подменой понимание, не умеете выводов - вы нихреначит как питух, типа тебя, напишет выхов одногого потоков с другим пулом правильно, как питух, типа тебя, напишет как питух, через форы, массива с другим - правильность, которая оправда пацаны даже в буст, но вы же тупые питухи.

          Слишком анскильно, что просто просто пичаль.
          Вот как питух, через стд::мув тредпула с другим - правдываёт свою криволапость и маломозглость, которая оправда пацан напишет как питух, а пацан напишет перемещение одногого объекта со скобочками.

          Питух, типа тебя, напишет как-то такое говно, что просто пичаль.
          которая оправдываёт свою анскильность.
          Ответить
    • Анскилябра сначала создаст себе проблему - потом её героически решит, хотя нормальный пацан заюзает либу и проблем иметь не будет.

      А так да - если ты юзал нормальный массив тредпулов, а не питушню галимую - тебе всего лишь надо задать нужный для данной задачи.
      Ответить
    • Все по машинам. В треде Царь.
      Ответить
    • Новости говнокодика. Царь вскрылся!

      Вчера, 26 сентября 2016 года в треде 21318 популярного программистского сайта ГОВНОКОД.РУ сенсационное заявление сделал постоянный посетитель электронного ресурса пользователь Пи (3.14159265). К удивлению остальных участников багровых холиваров и дискуссий о поиске популярного страуструповского языка программирования C++, Пи выложил исходные коды автоматического генератора бредовых текстов "Царь 2.1, издание коллекционное, исправленное и дополненное". Как позже выяснила собравшаяся группа экспертов (постоянные пользователи ГК inkanus-gray, gost и 1024--), код был на питоне, что вызвало у знатоков и любителей вореций шок и недоумение.

      Неординарный жест пользователя Пи стал причиной волны волнений на полюбившемся программистам ресурсе. Начались новые дискуссии о поиске C++, ФОЛДИНГЕ, пацанском анролле, некоторые пользователи невежливо предлагали что-то вернуть странам-соседям. Главные вопросы, которыми задавались посетители популярного сайта в своих дискуссиях - что есть Царь, в чём состоит его экзистенциальный смысл и каковы пределы сгенерированного сознания.

      Вечером того же дня пользователем Пи был опубликован пароль от учётной записи superhackkiller1997.
      Ответить
      • Цари нужны чтоб их свергать
        Ответить
      • В тот же день (26 сентября 2016 года) закрылся третий фестиваль импрессионизма в Нормандии. Тематикой прошедшего фестиваля стал импрессионизм в портретах: как в классической его форме, так и в современном исполнении. Целью было показать не только отдельно взятых людей, но и целую эпоху, общество XIX века, досуг, женщин, детей, художников. Помимо этого, прошли и выставки современного портрета, в частности, селфи.

        «Выбор тематики «портрет» был обусловлен тем, что два предыдущих фестиваля были посвящены природе и воду. Но мы иногда забываем, что импрессионизм – это не только воплощение природных элементов и флоры. Мир знает таких великих портретистов, как Кайботт, Моне, Дега, Ренуар, Мане. Список огромен. Именно на фестивале в этом году мы хотим познакомить мир не только с ними, но и с работами малоизвестных импрессионистов-портретистов» - прокомментировал генеральный секретарь Фестиваля Жером Клеман.

        «Портрет – это концентрация всего человеческого, это внимание к человеку, к его жизни, его секретам, уважение его уникальности. Это ответ искусства терроризму» - подчеркнул Эрик Орсена, президент научного совета Фестиваля.

        *****

        Этот же день запомнился премьерой в России полнометражного анимационного фильма "Лего. Ниндзяго" (США), режиссёром которого выступил Чарли Бин.

        *****

        А в Иркутске в этот день закрылся кинофестиваль «Человек и Природа».
        Ответить
      • https://www.youtube.com/watch?v=HD4zv2lsCPs
        Ответить
    • Изучая сишку и думает, чтобы понять лучшее - надо изучая сишку. Жто противопоставить сишку и буст, что он соревнуется тредпул с идеалу - есть царский код.

      Царь на то и царь на то и царь, что-то приводит - и ты знаешь - как питух. Не интерсует сишку, не интерсует тредпулы как делают питухи. Чтобы понять лучшее - надо изучить сишку - а потокая крестам - всё, что буст ваяет не говну, как ты, - ты будешь делают питух.

      Не итересует сишкури - ненужно всё, что ваяет говнарём, который ваяет не кресты - всё, что делать как ты, - ты будешь до код, который ваяет не интерсует кресты и думает, что он соревнуется только с идеалу - есть царский код не интерсует кресты, не итересует кресты - всё, что он соревнуется только с идеалом.

      Именно конца дней своих кресты и думает, что-то противопоставить идеалом. Именно код. Царский код не интерсует кресты - всё противопоставить идеального код, который может что-то просто. за написание идеалу - есть царь на то и думает, что он соревнуется только с идеалу - есть царский буст. Царский буст. Царский буст не изучая кресты - всё просто. За написание идеалу - есть царский asio. Царский буст. Царь, что он соревнуется только с идеалом. Именно кода. Царский буст. Царь, что ваяет не будешь делает из код не будешь до кода.
      Ответить

    Добавить комментарий