локировка потоков лишь с одним триггером на включение
У меня есть массив который должен читаться рядом потоков асинхронно, а так же есть один метод который дописывает данные в массив и иногда удаляет от туда данные. Мне нужно что бы как только данный метод сработал все чтецы становились в очередь и дожидались завершения модификаций с массивом. Подскажите как это сделать ?
Использовать лок или семафоры не могу так как в данном случае доступ к массиву будет синхронным, а мне нужно синхронизировать доступ к нему лишь в момент его модификации. Подкажите есть ли что то вроде лока или же семафира который мог бы включаться лишь из одного метода и высвобождаться лишь этим методом ? Пишу на C# .net core 5
Дополнено :
Есть массив типа double около 100 000 записей может и больше, копировать не вариант так как скорость очень важна.
Есть потоки по номерам {1,2,3,4} Все потоки асинхронно читают данный массив просто читают без права изменений. Их нельзя ставить в очередь иначе вся система полетит или как минимум будет не так функционировать как нужно...
Есть метод который добавляет данные в массив, и удаляет их. К примеру в результате его работы массив вырос на 6 новых эллементов.
Задача, поставить на паузу все потоки которые работают с данным массивом, что бы они дождались пока поток модифицирующий массив, не закончил с ним работать.
class MyObject
{
readonly List<double> data = new();
public this[int ind]
{
get
{
return data[ind];
}
}
public void Modify(double[] newValues)
{
data.AddRange(newValues);
}
}
Это самый простой демонстрационный объект о котором идет речь. Вот мне нужно в индексаторе дожидаться пока не закончит работу метод Modify. И ждать лишь в том случае если метод Modify был запущен. Иначе все потоки смогут асинхронно брать значения через индексатор.