Здравствуйте, koenjihyakkei, Вы писали:
K>А накидайте плиз задачек для изучения многопоточности/атомиков. Или может уже есть где годные туториалы с практическими заданиями.
K>Спасибо.
https://docs.google.com/document/d/1X0lThx8OK0ZgLMqVoXiR4ZrGURHrXK6NyLRbeXe3Xac/edit#
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-вычислений, заканчивая расчетами сцен в играх и их отрисовкой, а также задачами из мультимедиа (кодирование, декодирование и прочая отдача/прием видео из/в сети).