|
0 / 0 / 0
Регистрация: 17.11.2018
Сообщений: 4
|
|
Неблокирующие алгоритмы на C++, многопоточность29.11.2019, 15:59. Показов 4047. Ответов 7
Метки нет (Все метки)
Добрый день!
Прошу помочь понять задание. Я новичок. Тема: неблокирующие алгоритмы. Задание дано для java, но мне нужно выполнить на C++ с помощью соответствующих конструкций. Разработать многопоточную программу, которая с помощью AtomicInteger и метода compareAndSet выполняет следующие операции для одномерного массива. Создать параллельные функции для нахождения: - количества элементов массива типа int; - контрольной суммы с использованием XOR для элементов массива типа int. - минимального и максимального элементов массива типа long, а также их индексы. Если я правильно понимаю, мне нужно создать массив, потом эти три функции для работы с ним, потом вручить разным потокам выполнение этих функций. Если правильно поняла, в C++ в неблокирующих алгоритмах используется <atomic>. Но я не могу понять, к чему тут применить <atomic>. Каждый поток будет выполнять свою функцию, которая заключается в чтении данных массива, а не в их модификации. Зачем же тогда тут этот неблокирующий алгоритм или я совсем неправильно поняла задание?
0
|
|
| 29.11.2019, 15:59 | |
|
Ответы с готовыми решениями:
7
Неблокирующие сокеты Неблокирующие сокеты MPI программы: неблокирующие сообщения |
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,112
|
||||||
| 29.11.2019, 19:38 | ||||||
|
Чисто теоретически...
Например, нужно найти минимум. Можно разбить массив на несколько частей (первая и вторая половины). Запустить для каждой части поток (два потока). В потоках найти минимумы по заданным частям (минимум первой половины и минимум второй половины). В конце выбрать минимум из полученных результатов каждого потока (минимальный из двух минимумов). Как можно тут прикрутить атомарные операции? В каждом потоке ищем не локальный минимум, а общий. Заводим атомарный минимум. Каждый поток сравнивает значение с ним и, если нужно, заносит в него новый минимум. Стрёмный какой-то вариант, но почему бы и нет... Стрёмный, потому что на запись требуется несколько операций, а они уже не будут атомарными по своей природе, только если их завернуть в какой-нибудь мьютекс... или атомарный локер.
С количеством проще, наверное имеется в виду количество элементов равных чему-то. Заводим атомарный счётчик и увеличиваем его из разных потоков. С XOR не очень понятно. Можно попробовать воспользоваться fetch_xor для каждого элемента, но какой смысл? Проще опять же посчитать локальные XOR и потом объединить результат.
1
|
||||||
|
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
|
||
| 29.11.2019, 20:21 | ||
|
Добавлено через 6 минут А вообще, нужно уточнить задание. В двух случаях фигурирует массив int, в третьем - long. Это что, два разных массива нужно? А может три - по массиву на каждый поток?
1
|
||
|
0 / 0 / 0
Регистрация: 17.11.2018
Сообщений: 4
|
||||||
| 29.11.2019, 20:51 [ТС] | ||||||
|
Ygg, благодарю! Сейчас попробую с атомарным минимумом.
Нам дали образец выполнения. На java. Но поскольку я не знакома с java, не могу понять, где там деление действий между потоками и почему считается 3 суммы?..
0
|
||||||
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,112
|
||||||||||||||||
| 29.11.2019, 23:07 | ||||||||||||||||
Сообщение было отмечено juliyasos как решение
Решение
IntStream.of(array) - создаём какой-то объект "стрим" из массива "array"IntStream.of(array).parallel() - создаём из стрима параллельный стримIntStream.of(array).parallel().forEach(<function>) - для каждого элемента стрима выполняем функцию "function"В случае параллельного стрима весь диапазон автоматически разбивается на несколько частей и для каждой части в отдельном потоке выполняется функция "function" Код ниже выполняет атомарное сложение:
atomicSum.compareAndSet(oldValue , newValue) - поместить в "atomicSum" значение "newValue" при условии что там сейчас лежит значение "oldValue". В противном случае возвращается ошибка и повторяем операцию.Жуть какая-то с точки зрения скорости выполнения на мой взгляд, но если оно так нужно, то можно посмотреть в сторону compare_exchange.
1
|
||||||||||||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||||||||
| 30.11.2019, 02:08 | ||||||||||||
1
|
||||||||||||
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,112
|
||
| 30.11.2019, 11:00 | ||
|
sum - это сумма посчитанная параллельным сложением без атомарности, может быть ошибочной atomicSum - это сумма посчитанная параллельным сложением с атомарностью, должна быть равна эталону
1
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 30.11.2019, 16:51 | ||
|
Единственная синхронизация здесь - ожидание завершения всех потоков.
1
|
||
| 30.11.2019, 16:51 | |
|
Помогаю со студенческими работами здесь
8
Неблокирующие сокеты и тайм-аут подключения Неблокирующие сокеты блокируют во время передачи данных или нет Реализовать алгоритмы построения прямой: простой пошаговый алгоритм и алгоритмы Брезенхема Циклические алгоритмы. Алгоритмы обработки последовательностей чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|