Непонятно с async-await в C# - 2
Я имел ввиду, что один поток постоянно добавляет данные в массив - не изменяет сами данные. А друго поток только считывает новые данные. Их действия никак не пересекаются.
Очевидно, что они пересекаются как минимум на уровне массива. И именно там надо синхронизировать ;) Не зря же сделали Concurrent-контейнеры ;)
Но даже с твоей аналогией все не так очевидно ;)
По аналогии, разгружают фуру одни грузчики и раскладывают груз в линию. А другие грузчики подходят и выложенный груз уносят на склад. По вашей логике, если с одного конца линии грузчики добавляют груз с фуры, то с другого конца другие грузчики брать этот груз не могут, и наоборот - надо заблокировать и синхронизировать.
Дело в том, в этом примере лента является синхронизируещем механизмом. Предлагаю убрать у ленты механику, т.е. вместо ленты у нас есть просто Х ячеек. При этом разгружающий фуру рабочий (а он должен быть один) должен класть коробки как можно ближе к себе, а рабочий склада (тоже один) тоже должен брать ближайшую к себе коробку. Получается такой FIFO контейнер. Так вот очевидно, что в момент, когда разгружающий фуру рабочий будет класть очередную коробку в ячейку, рабочий склада должен стоять и ждать ;)
В своей аналогии несколько грузчиков разгружают фуру и заполняют ленту и несколько рабочих уносят коробки на склад. В такой конструкции надо еще и блокировать доступ к ленте, так что без синхронизации никуда ;)