C# Cooking
132 subscribers
42 photos
50 videos
68 links
Просветительский канал по языку C# CSharpCooking.github.io
Download Telegram
КОЛЛЕКЦИИ ПРОИЗВОДИТЕЛЕЙ/ПОТРЕБИТЕЛЕЙ В C#

🔹 Производитель: добавление элемента.
🔹 Потребитель: извлечение с удалением.

📌 IProducerConsumerCollection: потокобезопасная коллекция.
🔸 Реализации: ConcurrentStack, ConcurrentQueue, ConcurrentBag.

🔍 Основные методы:
- CopyTo: копирование коллекции.
- ToArray: преобразование в массив.
- TryAdd: попытка добавления.
- TryTake: попытка извлечения.

Атомарность: проверка + действие без блокировки.

🚀 TryTake: какой элемент извлекается?
- Стек: последний добавленный.
- Очередь: первый добавленный.
- Пакет: наиболее эффективный для удаления.

#Programming #ConcurrentProgramming #Multithreading #DotNet #CSharp #Coding #SoftwareDevelopment #Concurrency #DataStructures #Developer #CodingLife #SoftwareEngineering #Algorithms #DataSynchronization #ComputerScience #Tech #DeveloperCommunity #Code #LearningToCode #DeveloperTools #ProgrammingTips #CodingKnowledge #TechWorld #Technology #Innovation
October 20, 2023
🔥 ConcurrentBag в действии!

Работает как связанный список связанных списков.
Метод Add пакета не допускает почти никаких состязаний, когда вызывается многими потоками одновременно.
Параллельные пакеты идеальны, когда количество вызовов Add и Таке сбалансировано в рамках потока.

🔍 Внутренняя кухня:
- Каждый поток имеет свой закрытый список.
- Извлечение происходит либо с "головы" своего списка, либо достигается "воровством" с "хвоста" другого.

📌 Важные моменты реализации:
- если поток добавляет элемент в свой закрытый список с числом элементов меньше двух, то накладывается блокировка на список, так как другой поток в это время может забирать данные текущего потока (stealing thread);
- если поток забирает элемент закрытого списка другого потока, то он забирает его не с "головы", а с "хвоста", то есть если в списке более двух элементов, то поток может заимствовать элемент без блокировки данного списка (в таком случае невозможно "состояние гонки", так как между добавляемым и забираемым элементом есть как минимум один промежуточный).

#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
November 2, 2023
🚀 BlockingCollection<T> в C#!

🔒 Всем, кто работает с многопоточными приложениями в .NET, знакома ситуация, когда методы вроде TryTake возвращают false на пустой коллекции. Часто бывает необходимо организовать ожидание, пока элемент не станет доступным. Для решения этой задачи в C# существует класс BlockingCollection<T>.

💡 Что делает BlockingCollection?
- BlockingCollection<T> оборачивает любую коллекцию, реализующую IProducerConsumerCollection<T>.
- Предоставляет блокирующие методы Take и Add, удобные в многопоточной среде.
- Позволяет ограничить размер коллекции, блокируя добавление новых элементов при достижении предела.

🔧 Как использовать?
1️. Создайте экземпляр, указав тип коллекции и максимальный размер.
2️. Используйте Add или TryAdd для добавления элементов.
3️. Используйте Take или TryTake для извлечения элементов.
- По умолчанию используется ConcurrentQueue<T>.
- Методы Add и Take могут блокироваться в зависимости от состояния коллекции.

🔄 Дополнительные возможности:
- GetConsumingEnumerable предлагает элегантный способ потребления элементов в бесконечном цикле.
- CompleteAdding закрывает коллекцию для добавления новых элементов.
- AddToAny и TakeFromAny позволяют работать сразу с несколькими блокирующими коллекциями.

🔑 Ключ к многопоточной эффективности:
BlockingCollection<T> идеально подходит для сценариев, где нужна гибкая и надежная синхронизация между производящими и потребляющими потоками.

#Multithreading #ConcurrentCollections #DotNetCore #AsyncProgramming #CSharpProgramming #CodingLife #DeveloperTools #SoftwareEngineering #TechCommunity #ProgrammingTips #CodeNewbies #TechWorld #SoftwareDevelopment
November 20, 2023
Очередь производителей/потребителей – структура, полезная как при параллельном программировании, так и в общих сценариях параллелизма. Ниже описаны основные аспекты ее работы.
• Очередь настраивается для описания элементов работы или данных, над которыми выполняется работа.
• Когда задача должна выполниться, она ставится в очередь, а вызывающий код занимается другой работой.
• Один или большее число рабочих потоков функционируют в фоновом режиме, извлекая и запуская элементы из очереди.

Очередь производителей/потребителей обеспечивает точный контроль над тем, сколько рабочих потоков выполняется за раз, что полезно для ограничения эксплуатации не только ЦП, но также и других ресурсов. Скажем, если задачи выполняют интенсивные операции дискового ввода-вывода, то можно ограничить параллелизм, не истощая операционную систему и другие приложения. На протяжении времени жизни очереди можно также динамически добавлять и удалять рабочие потоки. Пул потоков CLR сам представляет собой разновидность очереди производителей/потребителей, которая оптимизирована для кратко выполняющихся заданий с интенсивными вычислениями.

Очередь производителей/потребителей обычно хранит элементы данных, на которых выполняется (одна и та же) задача. Например, элементами данных могут быть имена файлов, а задача может осуществлять шифрование содержимого таких файлов. С другой стороны, применяя делегаты в качестве элементов, можно построить более универсальную очередь производителей/потребителей, где каждый элемент способен делать все что угодно.

Реализовать очередь производителей/потребителей можно, используя событие AutoResetEvent (а также впоследствии методы Wait и Pulse класса Monitor). Тем не менее, написание очереди производителей/потребителей с нуля стало необязательным, т.к. большая часть функциональности предлагается классом BlockingCollection<T>. На слайде продемонстрировано, как его задействовать.

#ParallelProgramming #ConcurrencyControl #ProducerConsumerQueue #ThreadManagement #CodingLife
December 5, 2023
C# 12 in a Nutshell: The Definitive Reference by Joseph Albahari
https://csharpcooking.github.io/theory/AlbahariCSharp12En.pdf
December 10, 2023
LINQPad 8
January 30, 2024
Приглашаем на предстоящую трансляцию для обсуждения параграфа "Многопоточная обработка" книги "Албахари Д. C# 9.0. Справочник. Полное описание языка". В рамках трансляции обсудим следующие темы:
- Создание потока
- Join и Sleep
- Блокирование
- Локальное или разделяемое состояние
- Блокировка и безопасность потоков
- Передача данных потоку
- Обработка исключений
- Потоки переднего плана или фоновые потоки
- Приоритет потока
- Передача сигналов
- Многопоточность в обогащенных клиентских приложениях
- Контексты синхронизации
- Пул потоков
Материал для предварительного ознакомления доступен по ссылке: https://csharpcooking.github.io/theory/AlbahariCSharp9Ru.pdf (см. страницы 628-644)
Дата и время трансляции: 20 марта, начало в 16:50.
Спикеры: Руслан Гибадуллин, Данил Гашигуллин.
Присоединяйтесь к нам, перейдя по ссылке: https://t.me/CSharpCooking?livestream=cfc8ebe8c5ef91e3d8
March 18, 2024
Media is too big
VIEW IN TELEGRAM
Запись трансляции с обсуждением параграфа "Многопоточная обработка" книги "Албахари Д. C# 9.0. Справочник. Полное описание языка", прошедшей 20 марта 2024 г., включает детальный разбор следующих тем:
- Создание потока
- Join и Sleep
- Блокирование
- Локальное или разделяемое состояние
- Блокировка и безопасность потоков
- Передача данных потоку
- Обработка исключений
- Потоки переднего плана или фоновые потоки
- Приоритет потока
- Передача сигналов
- Многопоточность в обогащенных клиентских приложениях
- Контексты синхронизации
- Пул потоков
🙏 pay.cloudtips.ru/p/d19fd09d
March 23, 2024