Я выполнил простую задачу по созданию списка фиксированного размера, который позволяет выполнять одновременную запись и может в любой момент удалять последний снимок элементов в списке.Конкретный список с фиксированным размером
Вот моя реализация. Смещение будет увеличиваться атомарно для каждого потока и сбросить, если достигнет размера списка. Различные потоки должны иметь изолированный доступ к каждой части массива.
Мой вопрос, когда я вызываю Dump(), первые несколько элементов не хранятся в списке. Кроме того, есть ли функция блокировки, которая может выполнять как увеличение, так и сброс, так что мне не нужно создавать объект-блокиратор и блокировку? Благодарю.
public static void Main(string[] args)
{
ConcurrentCircularFixedList<int> list = new ConcurrentCircularFixedList<int>(20);
Enumerable.Range(1, 30).AsParallel().Select(nu => list.Enqueu(nu)).ToList();
}
public class ConcurrentCircularFixedList<T>
{
private int _size;
private int _offset;
private sealed object _locker = new Object();
privateT[] _list;
public ConcurrentCircularFixedList(int size)
{
_size = size;
_offset = 0;
_list = new T[_size];
}
public int Enqueu(T item)
{
_list[_offset] = item;
lock(_locker)
{
Debug.Write("B " + _offset);
_offset += 1;
if(_offset == _size)
_offset = 0;
Debug.Write("A " + _offset + "\n");
}
return _offset;
}
public T[] Dump()
{
return _list.ToArray();
}
}
Нет блокировки на 'Dump', однако я не считаю, что блокировка необходима. – Aron
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что это принадлежит CR. – Aron
@BrianRasmussen, вы, ребята, быстро, я случайно нажал кнопку отправки. Пожалуйста, см. Мои вопросы. – Helic