Задачки на изучение многопоточности
От: koenjihyakkei Россия  
Дата: 15.05.22 19:44
Оценка: +1
А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.

Спасибо.
Re: Задачки на изучение многопоточности
От: AlexGin Беларусь  
Дата: 16.05.22 03:42
Оценка: 40 (2)
Здравствуйте, koenjihyakkei, Вы писали:

K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.


https://www.bogotobogo.com/cplusplus/multithreaded4_cplusplus11.php
https://www.softwaretestinghelp.com/multithreading-in-cpp
https://www.educative.io/blog/modern-multithreading-and-concurrency-in-cpp
https://www.geeksforgeeks.org/multithreading-in-cpp
https://coderslegacy.com/cpp-multithreading-tutorial

Всё вышеуказанное — это именно многопоточность в стиле C++11.
Характерный признак:
#include <thread>

Это современный подход для C++ проектов.

Есть также многопоточность в стиле POSIX (т.е. в стиле Си):
Характерные признаки:
#include <pthread.h>
...
pthread_create

Вот пример этого подхода:
https://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm
Отредактировано 16.05.2022 3:51 AlexGin . Предыдущая версия .
Re[2]: Задачки на изучение многопоточности
От: so5team https://stiffstream.com
Дата: 16.05.22 07:36
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Характерный признак:

AG>
AG>#include <thread>
AG>

AG>Это современный подход для C++ проектов.

Пожалуйста, не надо. Не надо считать это современным подходом.

То, что в современном C++ есть поддержка многопоточности "из коробки" не значит, что нужно пользоваться голыми std::thread, std::mutex и std::condition_variable (не говоря уже про std::atomic). Это низкоуровневые инструменты для случаев, когда ничего другого уже не подходит.

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

ЗЫ. Простите за эмоциональность, любимая мозоль.
Re[3]: Задачки на изучение многопоточности
От: AlexGin Беларусь  
Дата: 16.05.22 10:50
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Пожалуйста, не надо. Не надо считать это современным подходом.


А что Вы предлагаете считать современным подходом?

То, что нам предлагается в POSIX, WinAPI?
Типа pthread_create или же _beginthreadex — так это также низкоуровневые методы.

Можно взять Qt — там уровень повыше. Но не все инструменты Qt выше.

S>ЗЫ. Простите за эмоциональность, любимая мозоль.

Ладно
Отредактировано 16.05.2022 11:49 AlexGin . Предыдущая версия .
Re[4]: Задачки на изучение многопоточности
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 16.05.22 11:18
Оценка: +2
Здравствуйте, AlexGin, Вы писали:

AG>А что Вы предлагаете считать современным подходом?


Я могу предположить, что, например, Intel TBB или аналоги, такой как taskflow.
Re[4]: Задачки на изучение многопоточности
От: so5team https://stiffstream.com
Дата: 16.05.22 11:19
Оценка: 29 (3) +1
Здравствуйте, AlexGin, Вы писали:

AG>А что Вы предлагаете считать современным подходом?


Например, инструменты вроде HPX, Intel TBB, taskflow, CAF, sobjectizer, rotor и т.д.

Да даже OpenMP, которому много лет, может быть лучше.

Если смотреть на stdlib, то на execution policy добавленные в C++17.

AG>То, что нам предлагается в POSIX, WinAPI?

AG>Типа pthread_create или же _beginthreadex — так это также низкоуровневые методы.

Именно.

AG>Можно взять Qt — там уровень повыше.


Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ.
Re: Задачки на изучение многопоточности
От: sergii.p  
Дата: 16.05.22 12:25
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:
Deadlock empire
вроде здесь ссылку и встречал, но повторить можно.
Re[5]: Задачки на изучение многопоточности
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 16.05.22 12:38
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>Именно.

Прикольно, да. pthread_create и _beginthreadex прямо так сильно отличаются от голых std::thread и std::async.
  Скрытый текст
Вангую, будут опять рассказы что я ничего не понимаю и что всё не так, естественно без каких либо доказательств и реального кода.

S>Брать Qt для чего-то кроме GUI так себе идея. Но тут уж каждый ССЗБ.
Вовсе нет, просто ты замкнулся в своём мирке sobjectizer-а и не знаешь ничего другого, в том числе и QT, и то как он используется.
Sic luceat lux!
Re[5]: Задачки на изучение многопоточности
От: AlexGin Беларусь  
Дата: 16.05.22 12:38
Оценка:
Здравствуйте, 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.

Что же касается multi-threading, в Qt есть высокоуровневый API:
https://doc.qt.io/qt-5/threads-technologies.html
https://doc.qt.io/qt-5/qtconcurrent-index.html
https://doc.qt.io/qt-5/qfuture.html

Он в чем-то уступает предложенным Вами инструментам?

P.S. ЕМНИП тот же sobjectizer — Ваше творчество?
Re[6]: Задачки на изучение многопоточности
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 16.05.22 14:30
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Что же касается multi-threading, в Qt есть высокоуровневый API:


А он позволяет организовать графы вычислений с разными типами соединений (очереди и т.п.) между ними?
Re[6]: Задачки на изучение многопоточности
От: so5team https://stiffstream.com
Дата: 16.05.22 15:06
Оценка:
Здравствуйте, 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, то буду признателен.
Re[6]: Задачки на изучение многопоточности
От: so5team https://stiffstream.com
Дата: 16.05.22 15:14
Оценка: 4 (1)
Здравствуйте, 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 — Ваше творчество?


Да.
Re[7]: Задачки на изучение многопоточности
От: AlexGin Беларусь  
Дата: 16.05.22 18:21
Оценка: -1
Здравствуйте, 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).
Отредактировано 16.05.2022 21:34 AlexGin . Предыдущая версия . Еще …
Отредактировано 16.05.2022 18:22 AlexGin . Предыдущая версия .
Re[2]: Задачки на изучение многопоточности
От: koenjihyakkei Россия  
Дата: 16.05.22 21:21
Оценка:
Здравствуйте, AlexGin, Вы писали:

Да не, теорию то я более менее знаю, мне бы именно какие-нибудь задачи.

Например, реализовать очередь single-reader/multiple-writer, но вот чем ее нагрузить... Или, например, задача на lock-free.

В общем, что сейчас самое распространенное в многопоточном программировании, где лучше всего можно руку набить?

ЗЫ: на текущей работе совсем не встречаюсь с канкаренси программированием, вот хотелось бы восполнить пробел.
Re[2]: Задачки на изучение многопоточности
От: koenjihyakkei Россия  
Дата: 16.05.22 21:22
Оценка:
Здравствуйте, sergii.p, Вы писали:

Так это ж С#
Re[4]: Задачки на изучение многопоточности
От: qqqqq  
Дата: 17.05.22 02:27
Оценка:
Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. Как можно работать потоками без приоритетов? В C++ классе thread полторы функции, скорее всего там еще много чего позабыто.
Re[6]: Задачки на изучение многопоточности
От: Vzhyk2  
Дата: 17.05.22 06:25
Оценка:
S>>Например, инструменты вроде HPX, Intel TBB, taskflow, CAF, sobjectizer, rotor и т.д.
S>>Да даже OpenMP, которому много лет, может быть лучше.
AG>>>То, что нам предлагается в POSIX, WinAPI?
AG>>>Можно взять Qt — там уровень повыше.
Для этого любой и перечисленного выше годиться, а также годиться распараллеливание и на потоках стандартных и на процессах. Вопрос лишь в возможности самого распараллеливания алгоритма. Есть много алгоритмов, что не распараллеливаются вообще.
Re[5]: Задачки на изучение многопоточности
От: Vzhyk2  
Дата: 17.05.22 06:29
Оценка:
Q>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты. Как можно работать потоками без приоритетов? В C++ классе thread полторы функции, скорее всего там еще много чего позабыто.
Это всего-лишь простейшая обертка над стандартными потоками, предлагаемыми в системе и она тебе отдает хендл и дальше извращайся с ним, как хочешь.
Re[8]: Задачки на изучение многопоточности
От: Vzhyk2  
Дата: 17.05.22 06:36
Оценка:
AG>Кстати, что касается "закручивания_гаек": брать Qt пользователю из РБ в последние полтора месяца просто так — невозможно.
AG>Выручает — только vpn (на IP-шник из Беларуси — отказ). Приходится прикидываться гейропейцем
Можешь еще собирать сам из исходников.
Re[3]: Задачки на изучение многопоточности
От: sergii.p  
Дата: 17.05.22 06:39
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Так это ж С#


какая разница? Все механизмы ведь идентичные.
Re: Задачки на изучение многопоточности
От: Cyberax Марс  
Дата: 17.05.22 06:57
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.

K>Спасибо.
https://docs.google.com/document/d/1X0lThx8OK0ZgLMqVoXiR4ZrGURHrXK6NyLRbeXe3Xac/edit#
Sapienti sat!
Re[5]: Задачки на изучение многопоточности
От: B0FEE664  
Дата: 23.05.22 12:33
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты.

Встречный вопрос: зачем приоритеты могут понадобится?
И каждый день — без права на ошибку...
Re[6]: Задачки на изучение многопоточности
От: wl. Россия  
Дата: 23.05.22 16:34
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, qqqqq, Вы писали:


Q>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты.

BFE>Встречный вопрос: зачем приоритеты могут понадобится?

в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки
Re[7]: Задачки на изучение многопоточности
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.05.22 02:41
Оценка:
Здравствуйте, wl., Вы писали:

Q>>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты.

BFE>>Встречный вопрос: зачем приоритеты могут понадобится?

wl.>в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки


Мне примерно ноль раз нужно было расставлять приоритеты потокам
Маньяк Робокряк колесит по городу
Re[3]: Задачки на изучение многопоточности
От: DiPaolo Россия  
Дата: 01.06.22 08:40
Оценка:
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-вычислений, заканчивая расчетами сцен в играх и их отрисовкой, а также задачами из мультимедиа (кодирование, декодирование и прочая отдача/прием видео из/в сети).
Патриот здравого смысла
Re: Задачки на изучение многопоточности
От: Sazon  
Дата: 01.06.22 11:07
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.


K>Спасибо.


Давно хотел почитать "Is Parallel Programming Hard, And, If So, What Can You Do About It?" (McKenney)
Сейчас ,наконец, решился, там как раз со счетчиков все начинается.
Re[7]: Задачки на изучение многопоточности
От: B0FEE664  
Дата: 03.06.22 15:22
Оценка:
Здравствуйте, wl., Вы писали:

Q>>>Внезапно, у этих C++ потоков не оказалось возможности задать им приоритеты.

BFE>>Встречный вопрос: зачем приоритеты могут понадобится?
wl.>в играх например. Расчет кадра имеет больший приоритет, чем воспроизведение музыки
Допустим, что приоритеты можно назначить. Какой эффект вы от этого ожидаете? Сначала проигрываем картинку, а потом звук? Так что ли?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.