C# Cooking
133 subscribers
40 photos
50 videos
66 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
🔥 ConcurrentBag в действии!

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

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

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

#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists