C# Cooking
133 subscribers
40 photos
50 videos
66 links
Просветительский канал по языку C# CSharpCooking.github.io
Download Telegram
🔥 ConcurrentBag в действии!

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

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

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

#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
🚀 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