Безопасная очередь потока аккумуляторC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Безопасная очередь потока аккумулятор

Сообщение Anonymous »

Я пишу код 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»