+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
Dummy00001 12.05.2016 15:52 # 0
все перепесать на жабе + спринг? угадал?
roman-kashitsyn 12.05.2016 16:07 # +1
Antervis 12.05.2016 16:41 # 0
roman-kashitsyn 12.05.2016 16:45 # 0
Если задачки чисто вычислительные, рекомендую tbb.
Если просто разбить несколько задачек по тредам - std::async.
Antervis 12.05.2016 17:51 # 0
guesto 12.05.2016 17:54 # 0
Использовать async и при этом думать в каком именно потоке что-то там выполнится, это как писать на JavaScript и думать в какой именно строке какого банка памяти контроллер разместит твою переменную
Antervis 12.05.2016 18:33 # 0
bormand 12.05.2016 18:55 # 0
3.14159265 13.05.2016 18:55 # +3
defecate-plusplus 12.05.2016 19:21 # +4
дам тебе бесплатный совет
если ты серьезно упорол упёрся в железо и ожидание блокировок действительно узкое место (что обычно не очень типично, но всё же), то делай свой менеджер потоков, ресурсов, следи за утечками, пиши неблокирующиеся очереди, графы зависимостей, выжимай из бездушной машины последние 5%, так её!
но если же нет, то нет!
берёшь асио, доверяешь ему разруливание 1000 потоков, он отлично работает даже на говне на 400 мгц, ты уже выбрал с++, который не тормозит как жаба, сраный мутекс это повседневная необходимость, надёжность ПО не пустой звук, мутексы они ведь и в шаредптр тоже внутри, в каждом, пиво само себя не выпьет - сделал, работает быстро и с первого раза, не надо нихера дебажить, ничего не течет, науку ты не продвинешь этим - моник выключил и идёшь спокойно домой
одумайся
bormand 12.05.2016 19:22 # 0
Ну раз он уже разбил таски по ресурсам, вроде можно и без мутексов - запилить по страйду на группу и вперёд...
defecate-plusplus 12.05.2016 19:26 # +1
уже второй раз вижу в треде
знаю странд
а страйд...
гугл говорит
Страйд плюс для собак (Stride Plus) жидкий во флаконе. Натуральный препарат, сохраняющий подвижность суставов.
согласен, может помочь
bormand 12.05.2016 19:30 # 0
defecate-plusplus 12.05.2016 19:33 # +2
собсно, об этом мой большой спич наверху
не надо ссать доверять чужим библиотекам, которые неплохо решают твои задачи универсальным способом
гнать велосипед надо только в случае крайней нужды (ну или если нашёл фатальный недостаток, тоже годная причина)
3_14dar 12.05.2016 20:11 # 0
3.14159265 13.05.2016 18:44 # +3
Т.е. твой буст-асио - это пул над очередью с мьютексом, который по определению быстрее быть не может.
3.14159265 13.05.2016 18:37 # +4
dxd 13.05.2016 20:39 # +3
meinf 12.05.2016 20:12 # 0
ну так то атомарный счетчик и мьютекс это маленько разные вещи
Antervis 12.05.2016 21:29 # 0
Вариант 1: раскидываем евенты по потокам случайно. Тогда любой ресурс, который используется в более чем одном евенте (читай "в более чем одной функции"), становится разделяемым и его нужно оборачивать блокирующими примитивами.
Вариант 2: раскидываем евенты по потокам в соответствии с используемыми ресурсами. Тогда, количество ресурсов, о распределении которых надо беспокоиться, на порядки ниже. Можно вообще обойтись лишь теми, которые скрыты в реализации очереди команд.
Дело вообще не в быстродействии (хотя, конечно, хочется чтобы базовые вещи работали побыстрее). А в том, что велосипед размером в один 100-строчный хедер уменьшает общее количество синхронизирующих примитивов в системе в несколько раз.
3.14159265 13.05.2016 18:36 # +1
Как это будешь делать ты, я жду, причем это должно быть лучше по производительностино я понимаю, что ты анскильный питух - сделай хотябы так же, пожалуйста.
Причем заметь - я могу дампить любые задачи в памяти - даже фьючеры и прочее.
3.14159265 13.05.2016 18:39 # +2
Никто из питушков, не напишет тредпул оптимальней, чем Царь. Царям не надо знать питушарский boost - они не питухи типа тебя. Я понимаю как работает этот мир - создать произвольный тредпул для Царя не составляет труда.
Цари пишут предельный код для х86.
Понимаешь ещё в чём штука, если я сразу напишу на птхреад - пацаны мне скажут "ну на птхреад естественно будет быстрее - но у нас нет птхреад, у нас есть пару стоек с нехалемами - мы на них и считаем", причем пацаны именно так и говорят. Поэтому первоначальная моя цель - слить лалок, а уж потом я пойду, куплю вореций и буду на них считать.
3.14159265 13.05.2016 18:46 # +1
Плюсовик - животное. Тратят что-то бессмысленно только питухи, будь-то такты, строки, память и прочее. Писать код, не думая об анскилледах.
defecate-plusplus 13.05.2016 18:50 # +5
а нам ещё батрачить до заката электрического солнца, и завтра тоже...
3.14159265 13.05.2016 18:53 # +3
3.14159265 13.05.2016 19:01 # +4
Не слушай никого - пиши предельный код для штеуда.
Чтобы слил буст в хламину. Пул работает примерно за 2мютекса, дальше уже уперается в память.
Разбирацся в устройстве железа. Знание матчасти даёт буст не соизмеримый с той питушнёй для заедушных крестовиков.
3_14dar 13.05.2016 19:02 # +3
Dummy00001 12.05.2016 17:56 # 0
изврат. тебе просто нужны зависимости между задачами? так почему бы именно это и не реализовывать?
Antervis 12.05.2016 18:29 # 0
Dummy00001 12.05.2016 18:42 # 0
"Скажем, я хочу, чтобы задачи 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 должно делаться в том же потоке.
Antervis 12.05.2016 18:51 # 0
Dummy00001 12.05.2016 19:01 # 0
знаю что у джавистов даже есть какая-то либа для воркфлоу автоматизации которая это умеет (jbmp? или что-то в этом духе).
удивит если для крестов тоже чего подобного уже не наваяли. задача достаточно типичная. (смотри какие древние сети петри.)
defecate-plusplus 12.05.2016 19:08 # 0
бебебе?
так BPM (бузинес-процесс менедежемент есличо) системы и одну из жавоёбских либ для оных (jBPM) ещё никто не называл
3_14dar 13.05.2016 20:07 # 0
roman-kashitsyn 12.05.2016 22:46 # +2
Только обычно я скрываю такие подробности от клиентов ресурсов: есть простой интерфейс, операции возвращают фьючерсы, а внутри поток с очередью задач, огороженный pimpl-ом.
3_14dar 13.05.2016 18:59 # 0
someone 12.05.2016 16:14 # +4
kurwa 12.05.2016 21:54 # 0
Это особенность сипласплас. Оператор "скобки" у лямбды по-умолчанию константный. Если хочешь мутировать захваченные переменные, то лямбда должна быть mutable: []() mutable {}
Bobik 12.05.2016 23:28 # 0
kurwa 13.05.2016 00:01 # 0
guest 13.05.2016 00:06 # 0
Antervis 13.05.2016 07:22 # 0
полностью валидный функциональный объект. С одним НО!: он вообще никак не кастится в std::function<void()>.
kurwa 13.05.2016 07:55 # 0
Antervis 13.05.2016 10:31 # 0
передать по raw указателю
kurwa-nextgen 13.05.2016 17:29 # +1
3_dar 13.05.2016 18:14 # 0
3.14159265 13.05.2016 18:28 # +1
guest 13.05.2016 19:09 # +1
gost 17.05.2016 21:53 # +1
Родина дала им абстракции... Абстрагируйся, абстрагируйся от деталей! Блядь, не хочу, хочу жрать говно... Это программисты? Это программисты?! Новыми крестами обмазались, память ебут... Пидоры, блять, ебанные...
TarasB 13.05.2016 10:27 # +1
Antervis 13.05.2016 10:51 # 0
по факту, биндануть noncopyable объект можно:
На практике его можно вызвать или мувнуть. Но это всё id
TarasB 13.05.2016 16:40 # 0
Ээээ мувануть и передать по неконстантной ссылке? Это ок?
Xom94ok 13.05.2016 17:20 # 0
std::cref
http://ideone.com/KPInUc
Antervis 13.05.2016 19:21 # 0
Antervis 13.05.2016 19:51 # 0
bind куда-то себе внутрь сохраняет значение, переданное через move, и от него уже берет ссылку. И надо постараться, чтобы такой bind-объект умер раньше, чем выполнится вложенная функция
3.14159265 13.05.2016 22:52 # 0
Слишком анскильно, что просто просто пичаль.
Вот как питух, через стд::мув тредпула с другим - правдываёт свою криволапость и маломозглость, которая оправда пацан напишет как питух, а пацан напишет перемещение одногого объекта со скобочками.
Питух, типа тебя, напишет как-то такое говно, что просто пичаль.
которая оправдываёт свою анскильность.
3.14159265 13.05.2016 18:40 # +3
А так да - если ты юзал нормальный массив тредпулов, а не питушню галимую - тебе всего лишь надо задать нужный для данной задачи.
guest 13.05.2016 23:34 # +1
Vasiliy 13.05.2016 18:41 # +6
1024-- 13.05.2016 19:10 # +7
Вчера, 26 сентября 2016 года в треде 21318 популярного программистского сайта ГОВНОКОД.РУ сенсационное заявление сделал постоянный посетитель электронного ресурса пользователь Пи (3.14159265). К удивлению остальных участников багровых холиваров и дискуссий о поиске популярного страуструповского языка программирования C++, Пи выложил исходные коды автоматического генератора бредовых текстов "Царь 2.1, издание коллекционное, исправленное и дополненное". Как позже выяснила собравшаяся группа экспертов (постоянные пользователи ГК inkanus-gray, gost и 1024--), код был на питоне, что вызвало у знатоков и любителей вореций шок и недоумение.
Неординарный жест пользователя Пи стал причиной волны волнений на полюбившемся программистам ресурсе. Начались новые дискуссии о поиске C++, ФОЛДИНГЕ, пацанском анролле, некоторые пользователи невежливо предлагали что-то вернуть странам-соседям. Главные вопросы, которыми задавались посетители популярного сайта в своих дискуссиях - что есть Царь, в чём состоит его экзистенциальный смысл и каковы пределы сгенерированного сознания.
Вечером того же дня пользователем Пи был опубликован пароль от учётной записи superhackkiller1997.
guest 13.05.2016 20:43 # 0
inkanus-gray 13.05.2016 21:22 # 0
¡Viva la República!
inkanus-gray 13.05.2016 22:48 # +1
«Выбор тематики «портрет» был обусловлен тем, что два предыдущих фестиваля были посвящены природе и воду. Но мы иногда забываем, что импрессионизм – это не только воплощение природных элементов и флоры. Мир знает таких великих портретистов, как Кайботт, Моне, Дега, Ренуар, Мане. Список огромен. Именно на фестивале в этом году мы хотим познакомить мир не только с ними, но и с работами малоизвестных импрессионистов-портретистов» - прокомментировал генеральный секретарь Фестиваля Жером Клеман.
«Портрет – это концентрация всего человеческого, это внимание к человеку, к его жизни, его секретам, уважение его уникальности. Это ответ искусства терроризму» - подчеркнул Эрик Орсена, президент научного совета Фестиваля.
*****
Этот же день запомнился премьерой в России полнометражного анимационного фильма "Лего. Ниндзяго" (США), режиссёром которого выступил Чарли Бин.
*****
А в Иркутске в этот день закрылся кинофестиваль «Человек и Природа».
gost 17.05.2016 22:03 # +1
3.14159265 13.05.2016 22:34 # 0
Царь на то и царь на то и царь, что-то приводит - и ты знаешь - как питух. Не интерсует сишку, не интерсует тредпулы как делают питухи. Чтобы понять лучшее - надо изучить сишку - а потокая крестам - всё, что буст ваяет не говну, как ты, - ты будешь делают питух.
Не итересует сишкури - ненужно всё, что ваяет говнарём, который ваяет не кресты - всё, что делать как ты, - ты будешь до код, который ваяет не интерсует кресты и думает, что он соревнуется только с идеалу - есть царский код не интерсует кресты, не итересует кресты - всё, что он соревнуется только с идеалом.
Именно конца дней своих кресты и думает, что-то противопоставить идеалом. Именно код. Царский код не интерсует кресты - всё противопоставить идеального код, который может что-то просто. за написание идеалу - есть царь на то и думает, что он соревнуется только с идеалу - есть царский буст. Царский буст. Царский буст не изучая кресты - всё просто. За написание идеалу - есть царский asio. Царский буст. Царь, что он соревнуется только с идеалом. Именно кода. Царский буст. Царь, что ваяет не будешь делает из код не будешь до кода.
guest 13.05.2016 23:01 # +1
3.14159265 13.05.2016 23:18 # +1