Barrier - синхронизация потоков в .NET Core за 30 секунд
Vložit
- čas přidán 26. 08. 2022
- Пример использования класса Barrier для синхронизации работы потоков в DotNet Core.
Пример с кодом на GitHub:
github.com/codaza/BarrierExample
Telegram канал: t.me/codaza
На кофе ☕️: pay.cloudtips.ru/p/179d0532
Boosty: boosty.to/codaza
Patreon: / codaza
Telegram канал:
t.me/codaza
Пример с кодом на GitHub:
github.com/codaza/BarrierExample
Чуваааак, прошу, продолжай! Видосы потрясающие, начинающему си Шарп программисту очень круто и полезно!
Расскажи про паттерны программирования. В больших выпусках, было бы очень полезно, на реальных примерах)
Пили контент, у тебя отлично получается!
зы. В телеграм не забывай ссылки на ролики или сами ролики заливать ;)
плохое сравнение с пирамидой
лучше гоночный трек когда машины подьезжают к барьеру (линии старта) и когда будет подъедет последний и оповестит об этом( как и каждый кто подъезжал
), все стартанут дальше параллельно, каждый в своем потоке
Бро, давай еще паттернов)
Спасибо, хороший видос
ахукено брат
Зашло, лайк
Шикос
Очень годно
Уважаемый автор канала, а у Вас случайно нет авторских курсов по C# ? 😅
В чем разница, если запустить 3 метода с await ?
Не всегда async/await доступен
А как зарус ать задачу в параллельном режиме?
Тот же lock
Нет, это разные примитивы синхронизации. Просто попробуйте организовать логику описанную в видео на lock и вы поймете, что не сможете этого сделать так же просто, как с Barrier.
То есть мы можем запустить DoWork в три потока и второй этап начнётся только после того как отработает первый этап во всех потоках?
Да, Вы поняли принцип работы Barrier верно 🙂
Не понятно из примера в видео зачем параллелить если по тз они должны выполняться по очереди?
Мы делаем распараллеливание, чтобы выполнить работу быстрее. У алгоритма три этапа, они должны быть выполнены последовательно, но каждый из этапов можно выполнять в несколько потоков, чтобы выполнить его быстрее. Представьте три этапа:
1. Залить фундамент
2. Возвести стены
3. Поставить крышу
Этапы нужно сделать последовательно, так как нельзя поставить стены без фундамента и нельзя поставить крышу без стен. Этапы может выполнить 1 рабочий, но медленно или 3 рабочих, это будет быстрее.
А нельзя использовать цикл while?
Ой, не цикл, а функцию await, или корутину
А зачем тогда параллельно запускать каждую задачу если все равно быстрее от этого они не выполнятся?
Почему? Если выполнение одного этапа занимает 90 миллисекунд, то 3 потока это сделают за 30 миллисекунд, то есть в 3 раза быстрее. Алгоритм требует завершенности каждого из этапов перед выполнением следующего и не запрещает распараллеливание выполнения каждого из этапов.
@@codaza-channel Алгоритм требует завершенности каждого из этапов перед выполнением следующего и не запрещает распараллеливание.
Тогда:
Первый этап выполняется 30 миллисекунд. После этого параллельно выполняется второй этап и тоже занимает 30 миллисекунд. И последний этап тоже параллельно выполняется 30 миллисекунд после второго. И получается что весь процесс выполняясь параллельно и поэтапно занял 90 миллисекунд. Потому что чтобы выполниться следующему этапу ему нужно ожидать выполнения предидущего. 30+30+30 = 90
Смотрите, у нас есть 3 этапа. Предположим, что выполнение одного этапа в 1 поток занимает 90 миллисекнуд. Таким образом, 3 этапа будут выполнены за 270 миллисекунд. Но мы решаем подключить для обработки ещё 2 потока. Благодаря этому, каждый этап будет выполнен не за 90 миллисекунд, а за 30 миллисекунд. Таким образом, вся задача из трех этапов будет выполнена за 90 миллисекунд (не за 270).
Да, перед началом выполнения очередного этапа нужно дождаться завершения всех потоков, но эти издержки незначительны.
@@codaza-channel Ааа, я просто не так понял.
Я думал что вся задача это 90 миллисекунд. А так то да если каждый этап можно распараллелить на 3 части то конечно.
Спасибо что объяснили.
Чем от семафора отличается?
Так сесофор просто ограничивает количество потоков и не регулирует их поведение
канал закрылся?
Тоже интересно