Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Непонятно с async-await в C# - 2

03.09.21 15:14
Re: Непонятно с async-await в C# - 2
 
alex445 свой человек
в ответ AlexNek 03.09.21 13:07, Последний раз изменено 03.09.21 15:23 (alex445)

Вобщем, сейчас на всё есть готовые буквари, типа такого

How to: Implement a producer-consumer dataflow pattern | Microsoft Docs

А раньше я городил велосипеды.


Дело в том, в этом примере лента является синхронизируещем механизмом. Предлагаю убрать у ленты механику, т.е. вместо ленты у нас есть просто Х ячеек. При этом разгружающий фуру рабочий (а он должен быть один) должен класть коробки как можно ближе к себе, а рабочий склада (тоже один) тоже должен брать ближайшую к себе коробку. Получается такой FIFO контейнер. Так вот очевидно, что в момент, когда разгружающий фуру рабочий будет класть очередную коробку в ячейку, рабочий склада должен стоять и ждать ;)
В своей аналогии несколько грузчиков разгружают фуру и заполняют ленту и несколько рабочих уносят коробки на склад. В такой конструкции надо еще и блокировать доступ к ленте, так что без синхронизации никуда ;)

Вы под синхронизацией понимаете некое место с объектом синхронизации, типа lock(synchronisationObject)?


Вобщем, к чёрту аналогии. Конкретно что было - был массив, в который писались данные с платы сбора данных в одном потоке. В другом я брал эти данные. Но нужно было брать какое-то минимальное число данных, необходимое для кванта расчёта. Поэтому читающий поток постоянно проверял, не пришло ли достаточно новых данных, затем считывал их, если пришло.


Массив был банальным списком. Про списки написано

List Class (System.Collections.Generic) | Microsoft Docs

It is safe to perform multiple read operations on a List, but issues can occur if the collection is modified while it's being read.

Как я понял, модификация коллекции означает - что сами элементы меняют или переставляют - т.е. удаляют, вставляют в середину и прочее. Если только добавляют в конец, то можно параллельно читать безопасно из той части, что уже была записана.


Если нет, то почему не потокобезопасно? Там внутри могут переаллокации старых данных происходить, если ты просто добавляешь данные в список? Но тогда сложность вставок не была бы О(1)

Collections and Data Structures | Microsoft Docs


Ещё раз - я при чтении не могу выйти за пределы списка, т.к. его размер постоянно проверяется. Изо всех "модификаций" списка - только добавление данных в конец. Всё. Всё равно не потокобезопасно читать? Штука в том, что у меня никогда проблем не было, если обращаться со списками таким образом - т.е. каких-то сбоёв или аномально прочитанных данных.

 

Перейти на