Здравствуйте, koenjihyakkei, Вы писали:
K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.
Здравствуйте, AlexGin, Вы писали:
AG>Характерный признак: AG>
AG>#include <thread>
AG>
AG>Это современный подход для C++ проектов.
Пожалуйста, не надо. Не надо считать это современным подходом.
То, что в современном C++ есть поддержка многопоточности "из коробки" не значит, что нужно пользоваться голыми std::thread, std::mutex и std::condition_variable (не говоря уже про std::atomic). Это низкоуровневые инструменты для случаев, когда ничего другого уже не подходит.
Поэтому не нужно такие вещи называть современным подходом. Повозиться с этим чтобы поэкспериментировать, набраться опыта и набить шишки -- это сколько угодно. Но чтобы вот так в чистом виде тащить в проект... Не надо.
Да даже OpenMP, которому много лет, может быть лучше.
Если смотреть на stdlib, то на execution policy добавленные в C++17.
AG>То, что нам предлагается в POSIX, WinAPI? AG>Типа pthread_create или же _beginthreadex — так это также низкоуровневые методы.
Именно.
AG>Можно взять Qt — там уровень повыше.
Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ.
Здравствуйте, so5team, Вы писали: S>Именно.
Прикольно, да. pthread_create и _beginthreadex прямо так сильно отличаются от голых std::thread и std::async.
Скрытый текст
Вангую, будут опять рассказы что я ничего не понимаю и что всё не так, естественно без каких либо доказательств и реального кода.
S>Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ.
Вовсе нет, просто ты замкнулся в своём мирке sobjectizer-а и не знаешь ничего другого, в том числе и QT, и то как он используется.
Здравствуйте, so5team, Вы писали:
AG>А что Вы предлагаете считать современным подходом?
S>Например, инструменты вроде HPX, Intel TBB, taskflow, CAF, sobjectizer, rotor и т.д.
Хорошо, спасибо!
А что можно взять из этого, для простого распараллеливания — ну скажем математических вычислений?
S>Да даже OpenMP, которому много лет, может быть лучше. S>Если смотреть на stdlib, то на execution policy добавленные в C++17.
AG>>То, что нам предлагается в POSIX, WinAPI? AG>>Типа pthread_create или же _beginthreadex — так это также низкоуровневые методы.
S>Именно.
AG>>Можно взять Qt — там уровень повыше.
S>Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ.
В том же Qt и для Data Base есть поддержка, и для Network, и для File System.
Здравствуйте, Kernan, Вы писали:
S>>Именно. K>Прикольно, да. pthread_create и _beginthreadex прямо так сильно отличаются от голых std::thread и std::async. K>Вангую, будут опять рассказы что я ничего не понимаю и что всё не так, естественно без каких либо доказательств и реального кода.
Прежде чем перейти к рассказам очень бы хотелось увидеть где я говорил, что голые std::thread выше уровнем, чем pthread_create/_beginthread или наоборот.
И особенно интересно увидеть где я что-либо говорил про std::async.
S>>Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ. K>Вовсе нет, просто ты замкнулся в своём мирке sobjectizer-а и не знаешь ничего другого, в том числе и QT, и то как он используется.
Про QT ничего не знаю (подозреваю, что это QuickTime).
С Qt знаком года с 1998-го. Во времена Qt3/4 написал на Qt не одну тысячу строк и сделал пару проектов.
Но про Qt5 и, тем более, про Qt6 знаю немного. Если есть какие-то бенчмарки сетевых приложений, написанных на Qt, показывающих превосходство Qt над Asio, ACE, libuv или libev/libevent, то буду признателен.
Здравствуйте, AlexGin, Вы писали:
AG>А что можно взять из этого, для простого распараллеливания — ну скажем математических вычислений?
Не моя область совершенно, но из общей эрудиции вспоминается, что для простого распараллеливания применяются OpenMP, HPX, Intel TBB (только Intel сейчас вроде как закрутил гайки в отношении разработчиков из РФ и РБ), taskflow.
S>>Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ. AG>В том же Qt и для Data Base есть поддержка, и для Network, и для File System.
Qt -- это сама по себе платформа. Или даже так: это замкнутая сама на себя экосистема. Которая, к тому же, с годами захватывает своих пользователей во все большую и большую кабалу. Пока вы живете полностью в этой экосистеме, то все хорошо (хотя к производительности отдельных компонентов Qt, насколько я помню, были претензии). Но если вы захотите, к примеру, какую-то часть кода из Qt-шного проекта перенести в не-Qt-шный (скажем, самописную поддержку какого-то протокола на QtNetwork), то... То вы подсадите на Qt еще один проект. Тогда как аналогичная реализация на Asio, например, может спокойно использоваться как в Qt-шных проектах, так и не в Qt-шный.
Впрочем, я же сказал, каждый ССЗБ, если Qt устраивает, то почему бы и да.
AG>P.S. ЕМНИП тот же sobjectizer — Ваше творчество?
Здравствуйте, so5team, Вы писали:
S>Не моя область совершенно, но из общей эрудиции вспоминается, что для простого распараллеливания применяются OpenMP, HPX, Intel TBB (только Intel сейчас вроде как закрутил гайки в отношении разработчиков из РФ и РБ), taskflow.
Спасибо, покопаю в этом направлении.
S>Брать Qt...
Кстати, что касается "закручивания_гаек": брать Qt пользователю из РБ в последние полтора месяца просто так — невозможно.
Выручает — только vpn (на IP-шник из Беларуси — отказ). Приходится прикидываться гейропейцем
AG>В том же Qt и для Data Base есть поддержка, и для Network, и для File System.
S>Qt -- это сама по себе платформа. Или даже так: это замкнутая сама на себя экосистема. Которая, к тому же, с годами захватывает своих пользователей во все большую и большую кабалу.
Ну это можно сказать практически о любой платформе/технологии/фреймворке
С другой стороны — при разработке на C++/Qt кабалы вроде никакой нет.
Проект на C++: хочешь используй фичи Qt, хочешь — C++ (ила даже ANSI_C).
Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. Как можно работать потоками без приоритетов? В C++ классе thread полторы функции, скорее всего там еще много чего позабыто.
S>>Например, инструменты вроде HPX, Intel TBB, taskflow, CAF, sobjectizer, rotor и т.д. S>>Да даже OpenMP, которому много лет, может быть лучше. AG>>>То, что нам предлагается в POSIX, WinAPI? AG>>>Можно взять Qt — там уровень повыше.
Для этого любой и перечисленного выше годиться, а также годиться распараллеливание и на потоках стандартных и на процессах. Вопрос лишь в возможности самого распараллеливания алгоритма. Есть много алгоритмов, что не распараллеливаются вообще.
Q>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. Как можно работать потоками без приоритетов? В C++ классе thread полторы функции, скорее всего там еще много чего позабыто.
Это всего-лишь простейшая обертка над стандартными потоками, предлагаемыми в системе и она тебе отдает хендл и дальше извращайся с ним, как хочешь.
AG>Кстати, что касается "закручивания_гаек": брать Qt пользователю из РБ в последние полтора месяца просто так — невозможно. AG>Выручает — только vpn (на IP-шник из Беларуси — отказ). Приходится прикидываться гейропейцем
Можешь еще собирать сам из исходников.
Здравствуйте, qqqqq, Вы писали:
Q>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты.
Встречный вопрос: зачем приоритеты могут понадобится?
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, qqqqq, Вы писали:
Q>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. BFE>Встречный вопрос: зачем приоритеты могут понадобится?
в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки
Здравствуйте, wl., Вы писали:
Q>>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. BFE>>Встречный вопрос: зачем приоритеты могут понадобится?
wl.>в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки
Мне примерно ноль раз нужно было расставлять приоритеты потокам
K>Да не, теорию то я более менее знаю, мне бы именно какие-нибудь задачи.
K>Например, реализовать очередь single-reader/multiple-writer, но вот чем ее нагрузить... Или, например, задача на lock-free.
K>В общем, что сейчас самое распространенное в многопоточном программировании, где лучше всего можно руку набить?
K>ЗЫ: на текущей работе совсем не встречаюсь с канкаренси программированием, вот хотелось бы восполнить пробел.
Ну например (не из узкоспециализированного, а первое), что приходит в голову:
1) выкачать какой-то сайт (раньше такие проги были, которые позволяли скачать и читать потом сайт в офлайне). Идешь по ссылке, ищешь все ссылки на други страницы, кладешь в общее хранилище. Хранилище постоянно пополняется. Есть N потоков, которые парсят и качают страницы из хранилища, ну и пишут туда новые. Сначала делаешь простой путь в лоб, потом наворачиваешь оптимизации и играешься с весами задач, пулом потоков, оптимизируешь загрузку по ЦПУ и прочее, если интересно.
2) распарсить и построить DOM модель HTML-страницы (или JSON, или XML — не важно). Суть в том, чтобы начать с одной ноды (узла), а его дочерние раскидать по тредам. Ну и то же самое: добавляешь новые ноды в список код, с другой стороны есть пул тредов, которые перелопачивают эти ноды. После решения "в лоб" можно накручивать хитрости: проставлять веса в зависимости от ноды (может глубины вложенности внутри нее), подбирать оптимальное количество потоков и прочее.
3) вводишь два слова, и потом вычисляешь путь от первого до второго в википедии (все ссылки на первой странице, и с каждой последующей). Либо другой вариант: проверять теорию, что что все пути ведут к слову "философия" (https://ru.wikipedia.org/wiki/Все_пути_ведут_к_философии). Запускаешь парсинг, и считаешь, сколько по времени занимает переход до философии, а также сколько в сколько шагов это происходит. Тут то же самое: пул тредов, пул ссылок, а дальше — наворачивание логики, чтобы сделать максимально быстро и максимально загрузить ЦПУ, ну либо какие-то свои критерии "хорошести" придумать.
Реальной практической пользы в этих примерах маловато, но как идеи потренироваться, думаю, пойдет. Также скажу, что возможно я далек от оптимальных решений этих задач.
4) можно взять любую задачу из ТМО (теория массового обслуживания) и эмулировать работу касс в магазинах, склада с поставкой-отгрузкой товара, автомобильный трафик и прочее.
Также много узкоспециализированных задач типа каких-то математических вычислений, расчета графов, CAD-вычислений, заканчивая расчетами сцен в играх и их отрисовкой, а также задачами из мультимедиа (кодирование, декодирование и прочая отдача/прием видео из/в сети).
Здравствуйте, koenjihyakkei, Вы писали:
K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.
K>Спасибо.
Давно хотел почитать "Is Parallel Programming Hard, And, If So, What Can You Do About It?" (McKenney)
Сейчас ,наконец, решился, там как раз со счетчиков все начинается.
Здравствуйте, wl., Вы писали:
Q>>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. BFE>>Встречный вопрос: зачем приоритеты могут понадобится? wl.>в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки
Допустим, что приоритеты можно назначить. Какой эффект вы от этого ожидаете? Сначала проигрываем картинку, а потом звук? Так что ли?