|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
Блокирующая кольцевая очередь. Будет ли правильно работать такой код? Нужен ли здесь Volatile.Read, Volatile.Write? Идея такая. Два SemaphoreSlim не дают одновременно писать и читать один и тот же элемент массива. Один семафор - количество элементов, которые точно можно читать (их запись завершена), другой - свободных элементов массива (чтение которых завершилось или они не были записаны). Таким образом, когда хвост доходит до головы или наоборот происходит блокировка. Вроде как, все нужные барьеры памяти тут есть. Своевременное обновление значения для каждого потока (кэш ядер) обеспечивают Volatile.Read, Volatile.Write. Или тут можно без них? Или для массивов это работать не будет так? Псевдокод: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Полный код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 23:07 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
cppc, 1. Задачу озвучьте, что вы таким образом хотите решить? 2. Напишите юнит-тест, какой результат ожидается. Пока я вижу, что написана какая-то фигня, которая вообще непонятно что делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 01:26 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
hVostt, Задача: читать файл по частям, каждую часть обрабатывать в отдельном потоке, результат записывать в файл. При этом использовать async/await, ThreadPool, и т.д. Для этого я собираюсь читать файл по частям каждую часть писать в блокирующую очередь (блокируется когда пуста или переполнена). В отдельных потоках читать из этой очереди, результат писать во вторую такую же очередь. В отдельном потоке читать из второй очереди результаты и писать в файл. Для этого мне и нужна эта очередь у неё 2 открытых метода void Enqueue(T val) - добавить в очередь (блокируется, если очередь переполнена пока не будет место) T Dequeue() - извлечь из очереди (блокируется, если пуста пока не появится элемент) Я реализовал её без использования lock. Но, не уверен корректно ли она будет работать. В этом и вопрос. Насколько это эффективнее чем lock? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 08:48 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
cppc, это проще делается, вам не нужно городить свой велосипед с локами. если нужен async/await, вам подойдут следующие решения: 1. Channels 2. TPL DataFlow 1-ое простое как тапки. 2-ое позволяет строить сложные цепочки обработки данных. по сути, вы запускаете 2 потока. один поток пишет, второй читает. код тривиальный, попробуйте сами разобраться. будут сложности пишите. а свой велосипед выкинье ) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 11:40 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
cppc, повторюсь. никакие локи и семафоры вам не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 11:41 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
Уже есть многопоточная очередь ConcurrentQueue<T> , самодельный велосипед вряд ли будет быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 12:06 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
Dima T Уже есть многопоточная очередь ConcurrentQueue<T> , самодельный велосипед вряд ли будет быстрее. Нет. сорян. Он не поддерживает async/await. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 12:54 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
hVostt Dima T Уже есть многопоточная очередь ConcurrentQueue<T> , самодельный велосипед вряд ли будет быстрее. Нет. сорян. Он не поддерживает async/await. Код ТСа тоже не поддерживает 22092040 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 13:00 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 14:04 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
hVostt, Задание на многопоточные примитивы библиотечными очередями пользоваться нельзя. Так кончено бы все сделал просто без велосипедов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 22:22 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
cppc hVostt, Задание на многопоточные примитивы библиотечными очередями пользоваться нельзя. Так кончено бы все сделал просто без велосипедов. какой хитрый умный перец выдумал такую задачу? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2020, 10:18 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
Это задание по своей сути не для C#. Препод копипастил задания ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2020, 18:29 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
ИМХО тут нет самого задания, а только изложение того как ТС понял задание, подозреваю что понял он его неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2020, 18:36 |
|
Реализация блокирующей очереди на SemaphoreSlim, без lock
|
|||
---|---|---|---|
#18+
cppc hVostt, Задание на многопоточные примитивы библиотечными очередями пользоваться нельзя. Так кончено бы все сделал просто без велосипедов. Ну ок. Напишите сначала контракт в виде интерфейса или класса без реализации. Затем юнит-тесты для них. Затем можно приступить к реализации на примитивах. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 00:21 |
|
|
start [/forum/topic.php?fid=20&fpage=11&tid=1398594]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 179ms |
0 / 0 |