Я пишу код C#. Я хочу найти структуру данных, которая может реализовать следующую стратегию: < /p>
Режим доступа к данным FIFO < /li>
Несколько независимых потоков Добавьте элементы в структуру данных < /li>
В случайный момент времени один потребитель заставляет всех издателей ждать структуры данных, чтобы закончить чтение. Извлеките все элементы из структуры данных, затем разблокируйте всех издателей и поддерживайте локальную копию всех элементов. < /Li>
< /ol>
Я бы предпочел использовать встроенный. Сетевые классы или их комбинация в пользовательской структуре данных.
Я написал такое решение, но, возможно, вы можете порекомендовать что -то лучше?
Может быть, это будет более эффективным для Используйте сравнение и обмен (CAS)?
и да, я не нашел, как настроить встроенные одновременные типы в режиме атомного снятия средств всего содержимого очереди /канала. < /p>
using System.Collections.Concurrent;
namespace Core.Backends.MicroTasking;
internal sealed class FIFOCapasitor
{
private readonly object p_swapLock = new ();
private readonly object p_workingLock = new ();
private readonly ConcurrentQueue p_firstQueue = [];
private readonly ConcurrentQueue p_secondQueue = [];
private volatile bool p_swapped = false;
public void Enqueue(T item)
{
lock (p_swapLock)
{
if (p_swapped)
p_secondQueue.Enqueue(item);
else
p_firstQueue.Enqueue(item);
}
}
public List DequeueAll()
{
lock (p_workingLock)
{
lock (p_swapLock)
{
p_swapped = !p_swapped;
}
List result = [];
if (p_swapped)
{
while (p_firstQueue.TryDequeue(out var entity))
if (entity is not null)
result.Add(entity);
}
else
{
while (p_secondQueue.TryDequeue(out var entity))
if (entity is not null)
result.Add(entity);
}
return result;
}
}
}
< /code>
p.s.: Мне нужна гарантия, что я вернусь из функции dequeueall () < /code>, по крайней мере,.
P.S.2: я готов прибегнуть к небезопасному коду и при необходимости уловок. Эта структура данных будет использоваться в высокопроизводительной графической обработке.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ccumulator
Безопасная очередь потока аккумулятор ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD?
Anonymous » » в форуме IOS - 0 Ответы
- 103 Просмотры
-
Последнее сообщение Anonymous
-