|
|
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
На просторах интернета встретилось несколько реализаций на Delphi. И даже на любимом sql.ru. Но все они показались мне замороченные и если честно очень длинные, хотя возможно и быстрые. У меня же задача простая. Есть 1 поток писатель и 1 поток читатель. Буфер создается заранее и заполняется массивами TidBytes. Если писатель быстрее читателя или наоборот, то ждем. Так как я еще тот синхронизатор/оптимизатор, то подскажите свежим взглядом, где могут быть ошибки чтения/записи в буфер? Код: pascal 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:48 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
Вашу проблему решает уже готовый http://docwiki.embarcadero.com/Libraries/Rio/en/System.Generics.Collections.TThreadedQueue при этом он решает еще и задачу несколько читают, несколько пишут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:58 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
все так. так и использую на текущий момент. Но скорости не хватает. В целом архитектура такая: Один писатель и куча читателей. Для каждого читателя отдельная очередь с писателем. И такое чувство, что читатели через крит. секции притормаживают писателя, а мне это совсем не нравиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:18 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
X-Cite Вашу проблему решает уже готовый http://docwiki.embarcadero.com/Libraries/Rio/en/System.Generics.Collections.TThreadedQueue при этом он решает еще и задачу несколько читают, несколько пишут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:26 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
cptngrb где могут быть ошибки чтения/записи в буфер? TInterlocked.Exchange для одного читателя/писателя не имеет смысла, для нескольких смотри выше TInterlocked.Read вообще бессмысленен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:43 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
cptngrb все так. так и использую на текущий момент. Но скорости не хватает. В целом архитектура такая: Один писатель и куча читателей. Для каждого читателя отдельная очередь с писателем. И такое чувство, что читатели через крит. секции притормаживают писателя, а мне это совсем не нравиться Монитор написан так, что если вы бесконечно пишете и читаете то критическая секция никогда не сработает. Там первые вроде 50 циклов/тактов проверка на ожидание как раз фрилоковая, а потом чтобы не нагружать процессор уже блокировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:43 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
X-Cite,бесконечно пишете и читаете то критическая секция никогда не сработает. В смысле? А как же синхронизация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:51 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
Вопрос не совсем по теме. А никто не знает какая пропускная способность сокета UDP? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:53 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
cptngrbВ целом архитектура такая: Один писатель и куча читателей. Для каждого читателя отдельная очередь с писателем. И такое чувство, что читатели через крит. секции притормаживают писателя Это для UDP? Какая-то вывернутая наизнанку архитектура. Обычно бывает наоборот: один поток только и делает что читает из сокета, а все остальные в него пишут, даже не синхронизируясь, ибо blocking mode. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:56 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, мне нужно читать только. Я одним потоком считываю с сокета данные и передаю в другие, которые уже собирают из пакетов конфетку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 20:17 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
просто я называю поток, который читает из сокета ПИСАТЕЛЕМ своего буфера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 20:18 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
Тогда lock-free алгоритмы тебе не только не нужны, но и полностью противопоказаны, поскольку приводят к процессорному голоданию producer-а. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 21:06 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
cptngrb, Для каждого читателя отдельная очередь с писателем.для синхры достаточно одного boolean без interlockИ такое чувство, что читатели через крит. секции притормаживают писателяну,Если писатель быстрее читателя или наоборот, то ждем.и как ты ждёшь? (если ждёшь, то это уже не Lock-free) И такое чувствосделай чтобы это было не чувство, а реальные цифры Я одним потоком считываю с сокета данные и передаю в другие, которые уже собирают из пакетов конфеткуЕсли цена передачи данных между потоками соизмерима со сбором конфетки, то можно ускориться в разы используя пул потоков считывателей из сокета (например, IOCP) внутри которых и будет обработка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2020, 15:06 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
[quot Bred eFeM#22080498]и как ты ждёшь? В первом посте вроде понятно. Кто быстрее тот и ждет. IOCP надо попробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2020, 09:09 |
|
||
|
Lock-free кольцевой буфер.
|
|||
|---|---|---|---|
|
#18+
cptngrb, В комплекте black shark есть коллекция TQueueFIFO<T> для пары потоков отлично работает без использования системных средств синхронизации. Но я использовал только для асинхронной очереди, т.е. с возможностью потерь в случае переполнения. Синхронный режим возможно не будет работать, хотя опция есть. Посмотрел код, как по мне - доработать не проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2020, 11:59 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39927010&tid=2038600]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 495ms |

| 0 / 0 |
