+2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 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
все перепесать на жабе + спринг? угадал?
Если задачки чисто вычислительные, рекомендую tbb.
Если просто разбить несколько задачек по тредам - std::async.
Использовать async и при этом думать в каком именно потоке что-то там выполнится, это как писать на JavaScript и думать в какой именно строке какого банка памяти контроллер разместит твою переменную
дам тебе бесплатный совет
если ты серьезно упорол упёрся в железо и ожидание блокировок действительно узкое место (что обычно не очень типично, но всё же), то делай свой менеджер потоков, ресурсов, следи за утечками, пиши неблокирующиеся очереди, графы зависимостей, выжимай из бездушной машины последние 5%, так её!
но если же нет, то нет!
берёшь асио, доверяешь ему разруливание 1000 потоков, он отлично работает даже на говне на 400 мгц, ты уже выбрал с++, который не тормозит как жаба, сраный мутекс это повседневная необходимость, надёжность ПО не пустой звук, мутексы они ведь и в шаредптр тоже внутри, в каждом, пиво само себя не выпьет - сделал, работает быстро и с первого раза, не надо нихера дебажить, ничего не течет, науку ты не продвинешь этим - моник выключил и идёшь спокойно домой
одумайся
Ну раз он уже разбил таски по ресурсам, вроде можно и без мутексов - запилить по страйду на группу и вперёд...
уже второй раз вижу в треде
знаю странд
а страйд...
гугл говорит
Страйд плюс для собак (Stride Plus) жидкий во флаконе. Натуральный препарат, сохраняющий подвижность суставов.
согласен, может помочь
собсно, об этом мой большой спич наверху
не надо ссать доверять чужим библиотекам, которые неплохо решают твои задачи универсальным способом
гнать велосипед надо только в случае крайней нужды (ну или если нашёл фатальный недостаток, тоже годная причина)
Т.е. твой буст-асио - это пул над очередью с мьютексом, который по определению быстрее быть не может.
ну так то атомарный счетчик и мьютекс это маленько разные вещи
Вариант 1: раскидываем евенты по потокам случайно. Тогда любой ресурс, который используется в более чем одном евенте (читай "в более чем одной функции"), становится разделяемым и его нужно оборачивать блокирующими примитивами.
Вариант 2: раскидываем евенты по потокам в соответствии с используемыми ресурсами. Тогда, количество ресурсов, о распределении которых надо беспокоиться, на порядки ниже. Можно вообще обойтись лишь теми, которые скрыты в реализации очереди команд.
Дело вообще не в быстродействии (хотя, конечно, хочется чтобы базовые вещи работали побыстрее). А в том, что велосипед размером в один 100-строчный хедер уменьшает общее количество синхронизирующих примитивов в системе в несколько раз.
Как это будешь делать ты, я жду, причем это должно быть лучше по производительностино я понимаю, что ты анскильный питух - сделай хотябы так же, пожалуйста.
Причем заметь - я могу дампить любые задачи в памяти - даже фьючеры и прочее.
Никто из питушков, не напишет тредпул оптимальней, чем Царь. Царям не надо знать питушарский boost - они не питухи типа тебя. Я понимаю как работает этот мир - создать произвольный тредпул для Царя не составляет труда.
Цари пишут предельный код для х86.
Понимаешь ещё в чём штука, если я сразу напишу на птхреад - пацаны мне скажут "ну на птхреад естественно будет быстрее - но у нас нет птхреад, у нас есть пару стоек с нехалемами - мы на них и считаем", причем пацаны именно так и говорят. Поэтому первоначальная моя цель - слить лалок, а уж потом я пойду, куплю вореций и буду на них считать.
Плюсовик - животное. Тратят что-то бессмысленно только питухи, будь-то такты, строки, память и прочее. Писать код, не думая об анскилледах.
а нам ещё батрачить до заката электрического солнца, и завтра тоже...
Не слушай никого - пиши предельный код для штеуда.
Чтобы слил буст в хламину. Пул работает примерно за 2мютекса, дальше уже уперается в память.
Разбирацся в устройстве железа. Знание матчасти даёт буст не соизмеримый с той питушнёй для заедушных крестовиков.
изврат. тебе просто нужны зависимости между задачами? так почему бы именно это и не реализовывать?
"Скажем, я хочу, чтобы задачи 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? или что-то в этом духе).
удивит если для крестов тоже чего подобного уже не наваяли. задача достаточно типичная. (смотри какие древние сети петри.)
бебебе?
так BPM (бузинес-процесс менедежемент есличо) системы и одну из жавоёбских либ для оных (jBPM) ещё никто не называл
Только обычно я скрываю такие подробности от клиентов ресурсов: есть простой интерфейс, операции возвращают фьючерсы, а внутри поток с очередью задач, огороженный pimpl-ом.
Это особенность сипласплас. Оператор "скобки" у лямбды по-умолчанию константный. Если хочешь мутировать захваченные переменные, то лямбда должна быть mutable: []() mutable {}
полностью валидный функциональный объект. С одним НО!: он вообще никак не кастится в std::function<void()>.
передать по raw указателю
Родина дала им абстракции... Абстрагируйся, абстрагируйся от деталей! Блядь, не хочу, хочу жрать говно... Это программисты? Это программисты?! Новыми крестами обмазались, память ебут... Пидоры, блять, ебанные...
по факту, биндануть noncopyable объект можно:
На практике его можно вызвать или мувнуть. Но это всё id
Ээээ мувануть и передать по неконстантной ссылке? Это ок?
std::cref
http://ideone.com/KPInUc
bind куда-то себе внутрь сохраняет значение, переданное через move, и от него уже берет ссылку. И надо постараться, чтобы такой bind-объект умер раньше, чем выполнится вложенная функция
Слишком анскильно, что просто просто пичаль.
Вот как питух, через стд::мув тредпула с другим - правдываёт свою криволапость и маломозглость, которая оправда пацан напишет как питух, а пацан напишет перемещение одногого объекта со скобочками.
Питух, типа тебя, напишет как-то такое говно, что просто пичаль.
которая оправдываёт свою анскильность.
А так да - если ты юзал нормальный массив тредпулов, а не питушню галимую - тебе всего лишь надо задать нужный для данной задачи.
Вчера, 26 сентября 2016 года в треде 21318 популярного программистского сайта ГОВНОКОД.РУ сенсационное заявление сделал постоянный посетитель электронного ресурса пользователь Пи (3.14159265). К удивлению остальных участников багровых холиваров и дискуссий о поиске популярного страуструповского языка программирования C++, Пи выложил исходные коды автоматического генератора бредовых текстов "Царь 2.1, издание коллекционное, исправленное и дополненное". Как позже выяснила собравшаяся группа экспертов (постоянные пользователи ГК inkanus-gray, gost и 1024--), код был на питоне, что вызвало у знатоков и любителей вореций шок и недоумение.
Неординарный жест пользователя Пи стал причиной волны волнений на полюбившемся программистам ресурсе. Начались новые дискуссии о поиске C++, ФОЛДИНГЕ, пацанском анролле, некоторые пользователи невежливо предлагали что-то вернуть странам-соседям. Главные вопросы, которыми задавались посетители популярного сайта в своих дискуссиях - что есть Царь, в чём состоит его экзистенциальный смысл и каковы пределы сгенерированного сознания.
Вечером того же дня пользователем Пи был опубликован пароль от учётной записи superhackkiller1997.
¡Viva la República!
«Выбор тематики «портрет» был обусловлен тем, что два предыдущих фестиваля были посвящены природе и воду. Но мы иногда забываем, что импрессионизм – это не только воплощение природных элементов и флоры. Мир знает таких великих портретистов, как Кайботт, Моне, Дега, Ренуар, Мане. Список огромен. Именно на фестивале в этом году мы хотим познакомить мир не только с ними, но и с работами малоизвестных импрессионистов-портретистов» - прокомментировал генеральный секретарь Фестиваля Жером Клеман.
«Портрет – это концентрация всего человеческого, это внимание к человеку, к его жизни, его секретам, уважение его уникальности. Это ответ искусства терроризму» - подчеркнул Эрик Орсена, президент научного совета Фестиваля.
*****
Этот же день запомнился премьерой в России полнометражного анимационного фильма "Лего. Ниндзяго" (США), режиссёром которого выступил Чарли Бин.
*****
А в Иркутске в этот день закрылся кинофестиваль «Человек и Природа».
Царь на то и царь на то и царь, что-то приводит - и ты знаешь - как питух. Не интерсует сишку, не интерсует тредпулы как делают питухи. Чтобы понять лучшее - надо изучить сишку - а потокая крестам - всё, что буст ваяет не говну, как ты, - ты будешь делают питух.
Не итересует сишкури - ненужно всё, что ваяет говнарём, который ваяет не кресты - всё, что делать как ты, - ты будешь до код, который ваяет не интерсует кресты и думает, что он соревнуется только с идеалу - есть царский код не интерсует кресты, не итересует кресты - всё, что он соревнуется только с идеалом.
Именно конца дней своих кресты и думает, что-то противопоставить идеалом. Именно код. Царский код не интерсует кресты - всё противопоставить идеального код, который может что-то просто. за написание идеалу - есть царь на то и думает, что он соревнуется только с идеалу - есть царский буст. Царский буст. Царский буст не изучая кресты - всё просто. За написание идеалу - есть царский asio. Царский буст. Царь, что он соревнуется только с идеалом. Именно кода. Царский буст. Царь, что ваяет не будешь делает из код не будешь до кода.