|
|
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Опять не дают мне покоя lock-free алгоритмы, опять немного почитал статьи на Хабре, и опять толком ничего не осилил В первую очередь меня интересует очередь. Я пытался портировать на Delphi такую реализацию очереди (раздел "Пример использования tagged pointers") Реализация не взлетела. Может быть я некорректно её переписал, но вот на что я обратил внимание, и что меня не устроило Смотрите строку D11 ("Читаем значение перед CAS, так как иначе другой dequeue может освободить next") Т.е. получается, может случиться ситуация, когда в одном потоке произойдёт копирование данных в результат, а другой поток будет финализировать эти данные. Если речь идёт о простых типах - Integer, Pointer и т.д. - то проблем нет. Но если происходит работа с Interface, Variant или строки - ошибка гарантирована. В общем основы Очередь представляет собой односвязный список от Head до Tail Dequeue извлекает элементы из Head, Enqueue добавляет элементы в Tail НО. Если Dequeue последнего элемента (Head = Tail) - то обнуляются оба указателя Если Enqueue самого первого элемента (Head = Tail = nil) - то Head тоже инициализируется В общем я целую неделю опробывал разные подходы с разной результативностью Основная проблема возникает тогда, когда мы добавляем элементы и ориентируемся на Tail, а Tail тем временем удаляется в другом потоке В итоге наибольшей стабильности я добился сегодня, когда стал исповедовать правило "кто Tail меняет - тот и задаёт правила" И мои внутренние тесты показали почти идеальный вариант. Только изредка терялся 1 элемент Сейчас я ещё больше упростил код, убрав "Tagged pointer" из Next-тов и FTail. Ошибок стало появляться больше. То ли из-за более интенсивной конкуренции, то ли из-за ABA. Представляю на ваш суд свой код, содержащий ошибки ( есть открытый репозиторий ). Надеюсь, вы свежим взглядом поможете делу P.S. Да, TSyncPointer - это некий "Tagged pointer", 8 байтовая структура, содержащая указатель и счётчик замен (обычно используется для избежания ABA) Код: 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 02:26:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Твой код не осилил (не хочу заморачиваться с пониманием новомодных конструкций), но это не важно. У меня к тебе вопрос. Ты уверен, что возможно обойтись без блокировок при добавлении/чтении(взятии в обработку элемента) очереди? Это единственная блокировка, которая нужна, а затраты на нее несравнимо меньше, чем на обработку элемента очереди, зачастую. Я лично не уверен. Впрочем, могу ошибаться - мало ли что можно понимать под очередью. Ну просто по логике. Из разных потоков идет добавление в ОДИН список заданий. Ну как может не быть синхронизации этого добавления (и удаления). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 02:46:53 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
YuRock, Уверен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 02:56:25 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
YuRockИз разных потоков идет добавление в ОДИН список заданий. Ну как может не быть синхронизации этого добавления (и удаления). AtomicCmpExchange ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 03:02:35 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
YuRock, На многопроцессорных системах в большинстве случаев LockFree выигрывает у блокировочных алгоритмов. Блокировка это уровень ядра и это затраты на переключение контекста между потоками. В lockfree такие переключения сведены к минимуму т.к. вся суть в атомарных операциях процессора. Для программ выполняющихся на компьютерах с 1 процессором такие алгоритмы бессмысленны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 03:07:31 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
X-CiteYuRock, На многопроцессорных системах в большинстве случаев LockFree выигрывает у блокировочных алгоритмов. Блокировка это уровень ядра и это затраты на переключение контекста между потоками. В lockfree такие переключения сведены к минимуму т.к. вся суть в атомарных операциях процессора. тут очень спорно, та же критическая секция в ядро далеко не сразу не уходит SOFT FOR YOU, на первый взгляд проблема в том, что не отслеживается версионность выделенного участка памяти, элемент может пролететь несколько раз по цепочке контейнер-аллокатор, и это логически будет уже "другой" элемент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 08:16:10 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, кроме того, надо ещё иногда устранять "гонки" как вариант (мидийная пауза говорят круче) Код: pascal 1. 2. 3. 4. 5. очень существенно ускоряет + проц в пиках не загружается на 100% Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 08:31:37 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Версионность есть в FHead. Этого недостаточно? Приведи пример, где может возникнуть ABA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 10:15:29 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Да, будут бэкофы позже. Но сейчас вопрос не в них, а в корректностям алгоритма ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 10:18:21 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Почему Sleep(1)? Передача неиспользованной части кванта это Sleep(0); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 10:25:15 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Версионность есть в FHead. Этого недостаточно? Приведи пример, где может возникнуть ABAя на вскидку не скажу, надо всё тестить, а это очень долго вот это тоже косяк - промежуточное состояние не должно блокировать объект, пользуйся только CAS Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. в догонку: зря ассемблерные вставки наделал, лучше маленько да лучше, TInterlocked из SyncObjs покроет все твои потребности в CAS методы вроде вот этого Код: pascal 1. бесполезны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 10:47:18 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeykealon(Ruslan), Почему Sleep(1)? Передача неиспользованной части кванта это Sleep(0);хз, но так быстрее выходило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 11:29:10 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Сейчас «ассемблер» используется только при замене значения FHead. Возможно ты прав, имеет смысл использовать стандартный двойной CAS. Но он многократно использовался, нареканий по нему нет Empty. Это простое сравнение Value на nil Sleep. Это типа backoff стратегии. Принято сначала делать ассемблерную команду pause, потом SwitchToThread, потом Sleep(1). Sleep(0) это относительно долгий простой потока. Быстрее он может быть только на синтетических тестах - за счёт минимизации конкуренции. Стандартные блокировочные алгоритмы, по крайней мере на спинлоке - тоже быстрее на синтетических тестах. Самое важное. Чтение или запись - сами по себе атомарные операции, кроме того они значительно быстрее. Поначалу я ВРОДЕ БЫ использовал атомики, но очередь по прежнему выдавала ошибки. Если можешь привести пример, где очередь сработает некорректно - милости прошу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 12:22:10 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
На какой конфигурации железа проходит тестирование. Если несколько процессоров, то могу предположить что не хватает барьеров памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 12:56:07 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
X-Cite, Так лок-фри он без барьеров вроде работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 13:05:05 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUSleep. Это типа backoff стратегии. Принято сначала делать ассемблерную команду pause, потом SwitchToThread, потом Sleep(1). Sleep(0) это относительно долгий простой потока Вообще-то, Sleep(0) это эквивалент SwitchToThread, с разницей лишь в том, что SwitchToThread отдаёт предпочтение "голодающему" потоку. А любое ненулевое значение в Sleep может усыпить поток очень на долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 13:26:46 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUX-Cite, Так лок-фри он без барьеров вроде работает :) Разве?? У каждого процессора свой кеш.. Что будет если 20 процессоров со своими кешами будут непрерывно класть и доставать из очереди элементы. А если это мобильные процессоры, у них слабосвязанный порядок инструкций. P.s. я не вижу в enqueue while true... Разве в строке //подменяем FTail на узел - если 20 нитей будут класть не будет ли потери ftail ??? Вроде как вездедолжен быть while true + cas ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 14:19:29 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Ведь суть lockfree это бесконечная попытка чего-либо за конечное число итераций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 14:20:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
rgreatYuRockИз разных потоков идет добавление в ОДИН список заданий. Ну как может не быть синхронизации этого добавления (и удаления). AtomicCmpExchange А работает эта функция (в винде) уж не через InterlockedExchange ли? А то о ней Майкросовт пишет так: function prevents more than one thread from using the same variable simultaneously. Перевод: функция предотвращает одновременное использование одной и той же переменной несколькими потоками . Какими средствами это достигается - объектами ядра или спец. командами процессора (или ф-циями, которые их вызывают) - я вообще-то не уточнял. Я о логике говорил (ты это слово не процитировал). А смысл один - синхронный доступ к списку заданий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 15:13:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
авторThis function is implemented using a compiler intrinsic where possible. For more information, see the WinBase.h header file and _InterlockedExchange. This function generates a full memory barrier (or fence) to ensure that memory operations are completed in order. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 18:07:56 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Ребят, давайте ближе к теме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 19:12:29 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, а почему FTail не защищен от ABA? Допустим, поток надолго засыпает в Dequeue прямо перед оператором if (AtomicCmpExchange(FTail, nil, Tail) = Tail) then За то время, пока он спал, очередь переходит в другое состояние, в ней уже 100500 элементов, причем последний сидит по тому же адресу. Этот if успешно выполнится, но из очереди будет взят последний, FTail обнулится и последующие Enqueue будут добавлять в *пустую* с их точки зрения очередь. Усе пропало, шеф )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 21:55:08 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Привет :) Да, наверное ты прав Скажи, а Node.Next должен быть защищён от ABA или нет? Ещё момент. В Enqueue я подменяю FTail. Его обязательно делать с инкрементом счётчика или не обязательно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 05:13:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Если говорить о той реализации, какая есть - то конкуренции за Next вообще нет, он просто инициализируется и читается Не таит ли такое допущение каких-то неприятных подводных камней? Но больше всего у меня вопросов по Head В Enqueue я инициализирую FHead-указатель. Данный код переписывает значение, а счётчик оставляет прежним. Как ты думаешь, где-то это может сыграть неприятную роль? И подозреваю я, что ошибка кроется как раз здесь. Когда в Enqueue голова просто инициализируется, а в Dequeue меняется атомиком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 05:26:14 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, море литературы на эту тему, зачем изобретать грабли, на которые уже кто-то наступил. На мой взгляд, чтобы не тратить время впустую имеет смысл соорудить конечный автомат и погонять его как следует, а уже потом пробовать строго доказать корректность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 11:51:19 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, как его соорудить? (КА) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:04:25 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Aleksandr Sharahov, как его соорудить? (КА) Построить имитационную модель, описывающую очередь (включая общую память) + 2-3 читающих потока + 2-3 пишущих потока (с их локальными данными). Определить возможные состояния потоков между операторами, работающими с очередью (включая общую память) + локальные данные. Определить общее состояние системы как сумму всего. Прогнать модель по всем возможным переходам состояний системы. Наткнуться на ошибки при работе очереди и исправить их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:25:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Теоретиков много и реализаций много. Для Delphi я видел только одну реализацию (два стека, инверсия) и мне этот вариант не нравится непрогнозируемостью времени исполнения. Есть в Tail накопится 100500 элементов, то при Dequeue бог знает, сколько займёт инверсия. Не факт, что теорию ты грамотно реализуешь на Delphi. Или в теории нет ошибок. Или в реализации на другом языке. Вон, с точки зрения теории, мой вариант прекрасен. Однако где-то закралась ошибка (и). Ну или вот реализация MSQueue от автора известной lock-free библиотеки libcds. Однако, его реализация не подходит для менейджед-типов (описал в первом посте почему) Я тебя спросил (как и всех впрочем), потому что у тебя глаз не замылен. И могут появиться идеи ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:59:41 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Да, тестовое приложение, где два пишущих потока и два читающих - есть (в репозитории ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 13:02:14 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUреализация MSQueue от автора известной lock-free библиотеки libcds ... не подходит для менейджед-типов (описал в первом посте почему) Честно говоря, не понял, почему оно не должно работать для указателя на строку. Кто строку юзает, тот ее и освобождает ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 14:28:40 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUДля Delphi я видел только одну реализациюGpLockFreeQueue, OTL смотрел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 14:32:25 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
vavanSOFT FOR YOUДля Delphi я видел только одну реализациюGpLockFreeQueue, OTL смотрел? первое я ему уже подкидывал, когда он ещё супер-пупер-мега-менеджер памяти делал чем-то не подошло ему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:10:50 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Строка D11 Пока один поток копирует строку, второй поток может её удалить Код: 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. Поток A читает валидный указатель-строку Поток B освобождает валидую строку Поток А обращается к несуществующей области памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:22:07 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Строка D11 Пока один поток копирует строку, второй поток может её удалить ... Поток A читает валидный указатель-строку Поток B освобождает валидую строку Поток А обращается к несуществующей области памяти 1. Я там не вижу строку D11. 2. Зачем они это делают? Почему вместо того, чтобы работать с *указателем* на строку, они работают со строкой? К работе со строкой надо переходить, когда есть полная уверенность в успешном извлечении данных из очереди. В нашем случае это указатель на данные. Его-то можно безопасно извлечь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:31:33 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
vavanSOFT FOR YOUДля Delphi я видел только одну реализациюGpLockFreeQueue, OTL смотрел? Смотрел Если я правильно понял, его реализация - имеет ограничение на количество элементов. А я хочу без ограничения Кроме того, он там сильно заморочился на теги, много атомиков В данной реализации должно быть быстрее Когда ошибку найдём ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:36:31 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Строку D11 надо смотреть здесь :) У них видимо данные не менаджатся и данная реализация устраивает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:42:38 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, И в чем проблема? Указатели нельзя копировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:48:48 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Ну если ты пишешь шаблоны - то копирование происходит просто Value := Node.Value. А финализация Finalize(Node.Value) Строку я привёл в качестве примера. Это может быть структура, содержащая строки, интерфейсы и динамические массивы. Или вообще Weak экземпляры классов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:52:48 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Кстати я избавился от ассемблера, заменил FTail на "tagged pointer" Сейчас работает стабильнее, но ошибки всё равно детектятся: Код: plaintext 1. 2. Код теперь выглядит так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:58:24 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Правильные пацаны помещают в очередь указатели на свои структуры данных. А ты экономишь одну загрузку адреса, и поэтому их реализация тебе не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:59:40 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Ну если ты пишешь шаблоны - то копирование происходит просто Value := Node.Value. А финализация Finalize(Node.Value) Строку я привёл в качестве примера. Это может быть структура, содержащая строки, интерфейсы и динамические массивы. Или вообще Weak экземпляры классов :) Финализировать раздельно надо. Отдельно элемент очереди. И отдельно (после разыменования указателя и использования структуры) свою структуру данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:04:48 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Персона Иванов ИИ обладает фамилией, именем и т.д., но не является элементом очереди. Это объект или запись класса персона. Иван Иваныч может одновременно стоять в 10 очередях: на квартиру, за зарплатой, на автобус, за хлебом... Но вместо него в этих очередях стоят адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:15:50 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Ну во-первых, претензии не ко мне - а к автору статьи :) Во-вторых, если мы храним указатель, то где-то его нужно выделять и освобождать. Либо должны будем юзать свой ограниченный буфер памяти в виде lock-free стека, что приведёт к лимитированности очереди и дополнительным атомикам, либо будем обращаться к стандартному менеджеру, который синхронизируется критической секцией, со всеми вытекающими. Тем более, для малых типов данных использовать указатель на память в куче - очень расточительно. Наконец, lock-free алгоритмы являются отличной возможностью поломать голову И я свою, похоже, сломал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:19:10 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, я же тебе уже говорил, Empty и всё такого рода это бессмысленные функции, а она у тебя опять в коде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:20:47 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Никто ж не против Иван Иваныча или адресов. Меня интересует общий случай, когда можешь поместить адрес, Иван Иваныча или динамический массив - и все они войдут и выдут из очереди во время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:21:19 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А я тебе говорил, что это сравнение Value на nil. И стоят они там, где нужно проверить Value на nil :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:22:24 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Никто ж не против Иван Иваныча или адресов. Меня интересует общий случай, когда можешь поместить адрес, Иван Иваныча или динамический массив - и все они войдут и выдут из очереди во время ну, тогда это действительно серьезный случай ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:29:38 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovkealon(Ruslan)Aleksandr Sharahov, как его соорудить? (КА) Построить имитационную модель, описывающую очередь (включая общую память) + 2-3 читающих потока + 2-3 пишущих потока (с их локальными данными). Определить возможные состояния потоков между операторами, работающими с очередью (включая общую память) + локальные данные. Определить общее состояние системы как сумму всего. Прогнать модель по всем возможным переходам состояний системы. Наткнуться на ошибки при работе очереди и исправить их. Добавлю, что на однопроцессрной машине бесполезно этим заниматься.. 1 процессор и N ядер не подходят тоже. От автора статьи так и не дождались его конфигурации ради чего это затевается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:30:22 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
X-CiteДобавлю, что на однопроцессрной машине бесполезно этим заниматься.. 1 процессор и N ядер не подходят тоже. От автора статьи так и не дождались его конфигурации ради чего это затевается. На 1 процессоре можно легко сымитировать N-процессорную очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:34:24 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, На 1 процессорном атомики не будут отваливаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:36:20 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЕсли я правильно понял, его реализация - имеет ограничение на количество элементову него очередь растет с выделением памяти по мере заполняемости SOFT FOR YOUА я хочу без ограниченияну такое только на компах без ограничений памяти SOFT FOR YOUон там сильно заморочилсякаждый делающий lf через это проходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:40:03 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, На 1 процессорном атомики не будут отваливаться Разумеется, не будут. Потому, что в имитации вообще нет ни одного CASа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:43:52 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), А я тебе говорил, что это сравнение Value на nil. И стоят они там, где нужно проверить Value на nil :) вижу, что не доходит... пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. так работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 16:51:50 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)так работает? Так работает, даже лучше . По крайней мере повторить ошибку не смог :) Тебя здесь смущает наверное не Tail.Empty, а FHead.Value := Node И ты прав, это место достойно более пристального внимания. Но из-за счётчика в FHead, а не из-за сравнения Tail на nil В данном коде Tail играет роль не текущего хвоста, и хвоста, который был раньше Т.е. если раньше хвост был пустой (очередь пустая) - FHead тоже инициализируем только что добавленным узлом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 17:03:45 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan)так работает? Так работает, даже лучше . По крайней мере повторить ошибку не смог :) Тебя здесь смущает наверное не Tail.Empty, а FHead.Value := Node И ты прав, это место достойно более пристального внимания. Но из-за счётчика в FHead, а не из-за сравнения Tail на nil В данном коде Tail играет роль не текущего хвоста, и хвоста, который был раньше Т.е. если раньше хвост был пустой (очередь пустая) - FHead тоже инициализируем только что добавленным узлом а ты тест нормальный сделай Код: 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. всегда забитая очередь никому не нужна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 17:41:22 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Не очень понятно, что ты хотел показать этим тестом Ошибок найдено не было Ожидание потоков ты не делаешь Проверок ты не делаешь Возможно ты хотел указать на случай, когда Dequeue будет простаивать в ожидании инициализации Но точно такой же "Sleep" может возникнуть во время Dequeue и очередь будет долго расти в Tail В любом случае никакого отношения это к Empty не имеет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 17:58:04 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUПроверок ты не делаешь хочешь сказать, что у тебя эксепшн не срабатывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 18:17:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Нет А у тебя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 18:29:44 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Нет А у тебя?практически моментально i7-4710HQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 18:33:31 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Выложи тест полностью и какая версия Delphi Потому что Dequeue не должен вернуть False Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Если выполнился Enqueue - то FTail не должен быть пустым Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 18:52:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, 20937473 - он весь и есть, модуль с репа твоего Delphi Xe 10.2 >>Потому что Dequeue не должен вернуть False это и проверяется, про эту ошибку я тебе уже писал - 20931687 ( - промежуточное состояние не должно блокировать объект, пользуйся только CAS ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 19:01:36 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Не, давай для чистоты эксперимента выкладывай все файлы Заодно народ у себя потестит Пока возникает ощущение, что ты в модулях как-то не то поправил :) И да Опиши модель на примере потоков A и B, как это могло произойти Ибо запись и чтение (GetEmpty) - сами по себе атомарные операции. Если память выровнена. А она должны быть выровнена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 19:11:19 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Не, давай для чистоты эксперимента выкладывай все файлы Заодно народ у себя потестит Пока возникает ощущение, что ты в модулях как-то не то поправил :) И да Опиши модель на примере потоков A и B, как это могло произойти Ибо запись и чтение (GetEmpty) - сами по себе атомарные операции. Если память выровнена. А она должны быть выровнена вот Фома неверующий некогда, нет у меня столько свободного времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 19:17:24 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Ребята, потестируйте, пожалуйста, пример выше У меня Exception не воспроизводится (i3-6100U) Если воспроизведётся - давайте подумаем, почему kealon(Ruslan), А мой тест у тебя проходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 19:31:39 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, код не смотрел, но осуждаю. Чем докажешь, что операторы из кода в начале темы Tail.Next := Node; и Next := PNode(Head.Value).Next; обращаются по валидным адресам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:06:04 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUРебята, потестируйте, пожалуйста, пример выше У меня Exception не воспроизводится (i3-6100U) Если воспроизведётся - давайте подумаем, почему kealon(Ruslan), А мой тест у тебя проходит? Коллеги, какая Delphi нужна? на 2010 не собирается :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:14:21 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Andy MezentsevКоллеги, какая Delphi нужна? на 2010 не собирается :( Delphi Xe 10.2 точно собирает SOFT FOR YOUРебята, потестируйте, пожалуйста, пример выше У меня Exception не воспроизводится (i3-6100U) Если воспроизведётся - давайте подумаем, почему kealon(Ruslan), А мой тест у тебя проходит? не прошёл на 4-й раз Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:21:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Очень хорошие вопросы Давай разбираться > Tail.Next := Node; Это стало быть Enqueue Единственное место, где могут получить доступ к этому узлу из другого потока - Dequeue Важной особенностью этого узла является то, что Next у этого узла всегда равен nil В Dequeue же анализируется Next узла Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. > Next := PNode(Head.Value).Next Это уже Dequeue На данный момент кто-то уже мог удалить элемент из очереди, и в Next будет содержаться мусор, вполне вероятно nil Однако, если Head уже невалидный, то FHead.AtomicCmpExchange(Next, Head) не пройдёт и цикл уйдёт на следующую итерацию Может быть возможен сценарий, когда в невалидном Head лежит ложный nil и это приводит к ошибке логики очереди? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:33:43 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Andy Mezentsev, Я тестирую минимум на XE3 Может быть на первом заведётся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:34:31 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUОднако, если Head уже невалидный, то... дальше можно не продолжать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:45:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAndy Mezentsev, Я тестирую минимум на XE3 Может быть на первом заведётсяна XE2 уже не компилится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 20:52:28 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)SOFT FOR YOUAndy Mezentsev, Я тестирую минимум на XE3 Может быть на первом заведётсяна XE2 уже не компилится Да, дженерики на Дельфях, и особенно старых компиляторах, оставляют желать лучшего. Их приходится допиливать наждаком с упоминанием какой-то матери :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 21:30:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovSOFT FOR YOUОднако, если Head уже невалидный, то... дальше можно не продолжать ) Ну а чего ты хотел :) Весь lock-free построен на том, что что-то валидно, а что-то уже нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 21:32:15 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНу а чего ты хотел :) Весь lock-free построен на том, что что-то валидно, а что-то уже нет не только весь lock-free, но еще и весь BrainMM ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 21:46:45 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan)пропущено... на XE2 уже не компилится Да, дженерики на Дельфях, и особенно старых компиляторах, оставляют желать лучшего. Их приходится допиливать наждаком с упоминанием какой-то матери :) дженерики зло. попробуй сделать так, чтобы они не понадобились ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 21:47:58 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Да, BrainMM использует стек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 22:21:14 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUРебята, потестируйте, пожалуйста, пример выше У меня Exception не воспроизводится (i3-6100U) Если воспроизведётся - давайте подумаем, почему kealon(Ruslan), А мой тест у тебя проходит?повторяется уже на 2-х потоках (так что по идее у тебя должен ловиться) либо зависает Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 22:26:39 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
У кого идея сценария, при котором может возникнуть ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 22:44:39 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, у меня идея не пытаться работать с данными по инвалидным адресам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 23:17:47 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 23:24:18 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Адреса валидные Данные невалидны Даже если взять стек (псевдокод): Код: pascal 1. 2. 3. 4. 5. 6. 7. Даже в случае стека ты не можешь однозначно судить, внутри Value значение Next валидное, или это мусор Value корректный только в том случае, если CAS прошёл успешно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 23:57:47 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Там нет очереди Да и смысл Ты здесь найди ошибку :). А то будешь всё время подсматривать у других :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 00:01:29 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUАдреса валидные Данные невалидны Адрес перестает быть валидным, как только ты отдал его менеджеру памяти. Это уже не твой адрес, это его адрес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 09:36:40 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Там нет очереди Да и смысл Ты здесь найди ошибку :). А то будешь всё время подсматривать у других :) ошибка у тебя уже есть - 20937825 я уже прошёл твой этап - и поискал уже прилично в своём коде, потому и говорю тебе про ошибки в твоём коде, которые ты упорно не признаёшь. красной тряпкой служат такие вещи: IntelockedExchange IsEmpty и похожие на них Я плохой учитель, я не могу на пальцах объяснить почему так, это наверное что-то должно сдвинуться у обучаемого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 09:49:24 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Существуют разные теории, как работать с памятью, чтобы при обращении по адресу не возник AV. Сейчас сделан общий пул в зависимости от размера. Ранее выделенные объекты больше не возвращаются менеджеру памяти. Фактически есть стек наших объектов и в Next хранится указатель на следующий объект. И да, он может быть равен nil. Если Head успели удалить, а я считаю Next валидным - то AtomicCmpExchange не пройдёт Если же Next равен nil - то всё равно значение (сам указатель) не должен быть равен Tail ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 09:59:39 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), То что ты приводишь - это предположения Озвучь сценарий, при котором возможна некорректная работа алгоритма Это и будет весомым аргументом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 10:02:04 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), То что ты приводишь - это предположения Озвучь сценарий, при котором возможна некорректная работа алгоритма Это и будет весомым аргументом по простому, по красным тряпкам Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: pascal 1. 2. 3. 4. так доступно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 10:24:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), > приехал, твоя очередь разорвана, когда она восстановитcя - вопрос Да, очередь разорвана Потому что мы имеем не с одним указателем, а сразу с двумя В рамках lock-free иначе ты не сделаешь, в любом случае будет некое промежуточное состояние, которое будет тормозить либо извлечение, либо добавление > if (Tail.Empty) then // пока это проверяешь состояние может стать другим, т.е. играешь в теорию вероятности. Не интересно состояние, которое будет потом В любом случае очередь разорвана и мы должны восстановить связи Tail в данном случае это узел, который был до Enqueue И либо в его Next мы прописываем узел, либо инициализируем FHead ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 10:34:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
"Среди кустарей с мотором, которыми изобиловал Старгород, он был самым непроворным и наиболее часто попадавшим впросак. Причиной к этому служила его чрезмерно кипучая натура. Это был кипучий лентяй. Он постоянно пенился. В собственной его мастерской, помещавшейся во втором дворе дома № 7 по Перелешинскому переулку, застать его было невозможно. Потухший переносной горн сиротливо стоял посреди каменного сарая, по углам которого были навалены проколотые камеры, рваные протекторы «Треугольник», рыжие замки, такие огромные, что ими можно было запирать города, мятые баки для горючего с надписями «Indian» и «Wanderer», детская рессорная колясочка, навеки заглохшая динамка, гнилые сыромятные ремни, масляная пакля, стертая наждачная бумага, австрийский шт ык и множество рваной, гнутой и давленой дряни. Заказчики не находили Виктора Михайловича. Виктор Михайлович уже где-то распоряжался. Ему было не до работы. Он не мог видеть спокойно въезжающего в свой или чужой двор ломовика с кладью. Полесов сейчас же выходил во двор и, сложив руки на спине, презрительно наблюдал за действиями возчика. Наконец сердце его не выдерживало. — Кто же так заезжает? — кричал он, ужасаясь. — Заворачивай! Испуганный возчик заворачивал. — Куда ж ты заворачиваешь, морда?! — страдал Виктор Михайлович, налетая на лошадь. — Надавали бы тебе в старое время пощечин, тогда бы заворачивал! Покомандовавши так с полчаса, Полесов собирался было уже возвратиться в мастерскую, где ждал его непочиненный велосипедный насос, но тут спокойная жизнь города обычно вновь нарушалась каким-нибудь недоразумением. То на улице сцеплялись осями телеги, и Виктор Михайлович указывал, как лучше всего и быстрее их расцепить; то меняли телеграфный столб, и Полесов проверял его перпендикулярность к земле собственным, специально вынесенным из мастерской отвесом; то, наконец, устраивалось общее собрание жильцов. Тогда Виктор Михайлович стоял посреди двора и созывал жильцов ударами в железную доску; но на самом собрании ему не удавалось побывать. Проезжал пожарный обоз, и Полесов, взволнованный звуками трубы и испепеляемый огнем беспокойства, бежал за колесницами." Не могу удержаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 10:37:00 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
schi, Забанить бы тебя за офтоп :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 11:06:06 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), > приехал, твоя очередь разорвана, когда она восстановитcя - вопрос Да, очередь разорвана Потому что мы имеем не с одним указателем, а сразу с двумя В рамках lock-free иначе ты не сделаешь, в любом случае будет некое промежуточное состояние, которое будет тормозить либо извлечение, либо добавление Это не особенность lock-free, это особенность твоего алгоритма. С такой "гарантией" очередь нафиг не нужна - 20937825 . То что ты не знаешь как это сделать, не значит, что это невозможно. SOFT FOR YOU > if (Tail.Empty) then // пока это проверяешь состояние может стать другим, т.е. играешь в теорию вероятности. Не интересно состояние, которое будет потом В любом случае очередь разорвана и мы должны восстановить связи Tail в данном случае это узел, который был до Enqueue И либо в его Next мы прописываем узел, либо инициализируем FHeadс lock-free не бывает неважного, просто пока ты не знаешь где неправ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 11:38:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Давай меньше флуда, больше дела Опиши сценарий, при котором может возникнуть ошибка К примеру я тебе привожу участки кода, где производится ожидание. Ожидание - не возвращает False Код: 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. И да. Будь другом, приведи пример очереди без промежуточных ожиданий. К примеру реализация Otl полна ожидающих стейтов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 12:04:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Запусти, пожалуйста, свой тест с таким классом: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Хочу убедиться, что проблема не в TSyncPointer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2017, 01:40:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Мы тут нашли одну ошибку. Когда счётчик FHead не инкрементировался Сейчас потестируйте, пожалуйста, пример килона https://bitbucket.org/d-mozulyov/lockfree/src ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 17:47:44 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, читаю я эту ветку и вспоминаю твой менеджер памяти. История повторяется один-в-один ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 18:19:46 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
asutp2, За тем лишь исключением, что BrainMM уже юзают, а лок фри ещё нет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:12:38 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUBrainMM уже юзаютЧто, прям в продакшене? Я бы поостерегся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:30:30 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
white_nigger, Ну на однопоточных то он не сбоит. Почему бы нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:34:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНу на однопоточных то он не сбоит. Почему бы нет Так на одноточке от него проку нет, даже по твоим замерам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:39:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Есть выравнивания, работа со страницами, executable куча ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:53:44 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Давайте про lock-free всё-таки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2017, 21:56:43 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUДавайте про lock-free всё-таки :)есть у меня одна идейка, гарантированная lock-free очередь на простых принципах, правда с ограничением размера. Нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 08:47:56 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)правда с ограничением размера. Нужно?едва ли:SOFT FOR YOUЕсли я правильно понял, его реализация - имеет ограничение на количество элементов. А я хочу без ограниченияхоть габр на тесте миллион элементов и заливал, но нужно строго "без ограничения" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 09:14:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)есть у меня одна идейка, гарантированная lock-free очередь на простых принципах, правда с ограничением размера. Нужно? Выкладывай. Даже если ТСу не нужно - пригодится кому-нибудь другому. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 09:35:05 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Я думал, будет ли выгода при кольцевом буфере. И пришёл к выводу, что всё примерно так же - 2 каса на чтение, и столько же на запись. Но в любом случае выложи. Почему нет. Вообще, самая простая реализация очереди - это два стека. Стек Tail обычный и Head инвертированный. Но я уже писал, почему не стал строить реализацию на её основе. А что с ошибками? По прежнему выдаёт эксепшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 10:48:16 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, https://svn.code.sf.net/p/cl4fpc/code/Containers/lfqueues.pas есть правда где-то ошибка на x86 c TAtomicInt = UInt64;, найти времени нет, но 32-битная версия пашет как задумано заправлю потом в бложик описание реализации тест https://svn.code.sf.net/p/cl4fpc/code/Containers/test/FreeLockTest.lpr SOFT FOR YOUА что с ошибками? По прежнему выдаёт эксепшн? ну если так закрыть конечно нет, но правильно же он от этого не заработает 20945540 ИМХО правильное рассуждение, нужен механизм проверки нахождения элемента в очереди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 15:29:28 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Код жёсткий :) Правда, я так и не понял, зачем столько стейтов По поводу Exception-ов Я ничего не закрыл. Я сделал инкремент счётчика при записи FHead. Эксепшны сыпятся или нет? По поводу поста - я ведь не против, может действительно дело в мусорном значении Next Но вот незадача - в случае эмуляции контейнера через стек - ошибок не происходит. По крайней мере у меня. А он работает по тому же принципу Да и придумать вариант, как может возникнуть ошибка - я тоже придумать не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 16:24:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Код жёсткий :) Правда, я так и не понял, зачем столько стейтов всё очень просто, попытаюсь объяснить в блоге как время будет PS: баг исправил SOFT FOR YOUПо поводу Exception-ов Я ничего не закрыл. Я сделал инкремент счётчика при записи FHead. Эксепшны сыпятся или нет? По поводу поста - я ведь не против, может действительно дело в мусорном значении Next Но вот незадача - в случае эмуляции контейнера через стек - ошибок не происходит. По крайней мере у меня. А он работает по тому же принципу Да и придумать вариант, как может возникнуть ошибка - я тоже придумать не могу TestUG не проходит, хотя проработал без сбоев заметно дольше с заменой 20945254 проходит без проблем вроде как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2017, 21:55:36 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Спасибо Конечно интересно почитать блог Но давай исправим ошибку в моей реализации А потом замерим производительность :) Я просто думаю, что контейнеры надо создавать опционально: с лимитированным количеством элементов и нет. Потому как в лимитированных реализациях может быть определённый профит, как с точки зрения функционала, так и с точки зрения производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 00:03:54 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Мне кажется, или у тебя ограничение на количество элементов жёстко - 21? Кстати DefaultValue можно не хранить, есть "функция" Default(T) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 00:12:13 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Спасибо Конечно интересно почитать блог Но давай исправим ошибку в моей реализации А потом замерим производительность :) Я просто думаю, что контейнеры надо создавать опционально: с лимитированным количеством элементов и нет. Потому как в лимитированных реализациях может быть определённый профит, как с точки зрения функционала, так и с точки зрения производительности.тут всё довольно просто: исходя из тестов что я знаю на i7: конкурентно в секунду можно провести 40 млн обменных операций с одной кэш-линейкой т.е. тупо InterlockedIncrement из 4-х и более потоков можно сделать 40млн/c, в один поток - 150млн/c представленный алгоритм упирается сейчас в 2.5 млн (добавление + удаление) в секунду твой (пока работает) - упирается в 3.5 млн (добавление + удаление)/c тут насколько я их понимаю добились - 16 млн. /c, и в явовской - 4 млн./c (проц вроде бы такой же как и у меня, но с другой стороны хз как они тестят, например забитая очередь явно шустрее идёт, чем близкая к нулю) т.е. ещё оптимизировать и оптимизировать, наверное, первое - это функцию разгрузки SOFT FOR YOUkealon(Ruslan), Мне кажется, или у тебя ограничение на количество элементов жёстко - 21? Кстати DefaultValue можно не хранить, есть "функция" Default(T) 10 и 21, в зависимости от типа (нужно 3 бита на состояние одной ячейки) Default(T) - в fpc старой версии её добавить не успели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 09:48:41 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Всё-таки производительность у AtomicIncrement, AtomicExchange и AtomicCmpExchange разная. Наверняка на 8 байтах картина ещё больше меняется. Я бы не стал обобщать :) И не совсем ясно как ты замеряешь производительность :) По первой ссылке стек, он разумеется, выполняется быстрее очереди. Его теста я что-то не увидел Да и джававского тоже ) Ну и потом, я не уверен на счёт твоей очереди, но вот в моей важно, есть конкуренция за оба поля или нет Т.е. если ты сначала добавишь 10 элементов, а потом извлечёшь - картинка будет более разумная. Нежели чем гонять один и тот же элемент туда-обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 18:02:17 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, практически одинаковая для текущей разрядности, во всяком случае на i7 (cmp версии только при успехе считать надо) у себя проверь, недолго соответственно при наличии 2-х операций на вставке, 2-х на удалении это 10млн/c максимум для моего проца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 18:20:58 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 23:14:08 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Народ, разъясните пожалуйста (признаюсь, всю ветку темы ТС не читал), чем не устраивает очередь с кольцевым буфером в котором указатель на тайл читающего и пишущего потоков "не пересекаются " при условии что для обеспечения многопоточности создаём одну очередь на каждую пару потоков??? Соотв-но, к примеру, для одного читающего и N в него пишущих создаём N очередей который опрашивает читающий... При этом отпадает необходимость в применении спец. синхронизирующих системных функций... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 13:00:47 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_Народ, разъясните пожалуйста (признаюсь, всю ветку темы ТС не читал), чем не устраивает очередь с кольцевым буфером в котором указатель на тайл читающего и пишущего потоков "не пересекаются " при условии что для обеспечения многопоточности создаём одну очередь на каждую пару потоков??? Соотв-но, к примеру, для одного читающего и N в него пишущих создаём N очередей который опрашивает читающий... При этом отпадает необходимость в применении спец. синхронизирующих системных функций...ситуация: 1 читающий, много пишущих - не самая распространённая одну очередь проще использовать, она становистя слабым местом систем типа акторов, например вот все и меряются ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 16:42:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Так он под Windows 8 Лучше тогда уж вручную брейкпоинт на память делать _StarikPro_, Мне кажется среди нас дельфистов алгоритмы lock-free вообще не в ходу. Мы о них знаем слишком мало. Поэтому я целиком и полностью за дискуссии, разные реализации, тесты и поиск ошибок. О высокой ценности моей реализации сложно судить, пока она выдаёт ошибки иногда. Лучше давайте сначала найдём ошибку в таком простом коде, а потом будем рассуждать о плюсах и минусах разных реализаций. Если говорить в теории, то ценность моего решения заключается в нескольких пунктах. Во-первых, нет явного ограничения на количество элементов в очереди (а в кольцевом есть) Во-вторых, нет ограничения на количество читающих или пишущих потоков В-третьих, производительность по идее (если речь не о первом элементе в очереди) на высоком уровне - только 2 атомика на операцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 20:59:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Так он под Windows 8 Лучше тогда уж вручную брейкпоинт на память делатьи в каком потоке он вызовется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2017, 21:22:07 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, .... Если говорить в теории, то ценность моего решения заключается в нескольких пунктах. Во-первых, нет явного ограничения на количество элементов в очереди (а в кольцевом есть) Во-вторых, нет ограничения на количество читающих или пишущих потоков В-третьих, производительность по идее (если речь не о первом элементе в очереди) на высоком уровне - только 2 атомика на операцию В моей реализации отсутствуют указанные ограничения если условиться об использовании одной очереди на "один канал передачи данных в одно направление", а про в-третьих вообще молчу... хотя на производительность не тестировал, всё устраивает на текущем этапе... Пока вижу только одно достоинство, и то сомнительное - простота в применении... kealon(Ruslan) , ситуация: 1 читающий, много пишущих - не самая распространённая Я это привёл в качестве примера, для доходчивости, так сказать, варианты можно реализовать любые... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 10:30:14 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_, Посмотри, где в моем коде ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 10:38:34 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU...(если речь не о первом элементе в очереди)... И опять же, не понимаю, к чему эти условности... первый не первый элемент, в чём проблема закольцевать очередь - тогда все элементы становятся равными ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 11:46:57 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
_StarikPro_, Я пока вижу, что ты языком чешешь Кольцевой-некольцевой Ни реализации твоей, ни ответа на вопрос, озвученный в топике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2017, 14:11:22 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Ребят, я попробовал заменить Fill на AtomicExchange Ошибка пока не воспроизводится Посмотрите у себя пожалуйста https://bitbucket.org/d-mozulyov/lockfree/src ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2017, 20:14:19 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, TestUG падает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 08:29:07 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Да еклмн Где там ошибка?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 09:03:02 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Да еклмн Где там ошибка?! не внемлишь же, уже говорил про эту ошибку вот тебе зависание: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 12:46:09 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
хотя нет вру, ожидание срабатывает непонятно как без ожидания проверить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:11:30 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), В Dequeue же просто вхолостую работает цикл, если Next не инициализирован ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 22:27:12 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, да заметил, 20968902 TestUG падает раз из 5-7 запусков, причём так же как и раньше - два потока для этого достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 22:58:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А идеи, как оно происходит - появились? Вообще, когда Enqueue есть, а Dequeue нет - это чистой воды потеря элемента. Мои тесты тоже иногда показывают, что теряют элемент. Уж не ABA ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 00:37:15 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
Добавил автотест, получил вот такую картину: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Т.е. потеряно сразу 4 элемента, идущих подряд. Точно ABA. Только где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 01:32:17 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUТ.е. потеряно сразу 4 элемента, идущих подряд. Точно ABA. Только где? не обязательно, проверь без переиспользования памяти, это исключит АБА ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:18:51 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Как это - без переиспользования памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:35:41 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Как это - без переиспользования памяти?выделяешь большой блок и от него отщипываешь пока не закончится н-р на 100 млн элементов, твоей очереди на 10 секунд точно хватит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:52:42 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Можно в Dequeue нод не возвращать системе Если комп под рукой - посмотри, пожалуйста Я только к вечеру до компа дойду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 11:16:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUkealon(Ruslan), Можно в Dequeue нод не возвращать системе Если комп под рукой - посмотри, пожалуйста Я только к вечеру до компа дойду за 10 раз TestUG не повторился, скорее всего ABA выходит PS: около 10-11 млн/c держится - "менеджер памяти ноды" надо менять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 16:32:55 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), В коде есть возможность «эмулировать» очередь через стек И в стеке используется та же модель аллоцирования памяти. А именно free list - самый элементарный и быстродейственный вариант И стек не давал ошибок, не давал ABA. Следовательно, дело не в менеджменте памяти, а в самом алгоритме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 18:37:51 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, про менеджер был вывод, что он довольно медленный АБА конечно в алгоритме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 19:10:39 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Да быстрее вроде некуда. Стек и память никуда не удаляется А как «долгость» может инициировать ABA? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 20:34:49 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, это так, на заметку, с АБА это не связано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 21:22:51 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, небольшими оптимизациями удалось приблизиться к техническому пределу на 4-х потоках https://sourceforge.net/p/cl4fpc/code/HEAD/tree/Containers/lfqueues.pas Код: plaintext 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. хз тока зачем это надо если критическая секция даст тоже самое. По идее дальше вся проблема в функции разгрузки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 08:43:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)хз тока зачем это надо если критическая секция даст тоже самоеlf-контейнеры (кроме прочих их достоинств и преимуществ) могут оказаться нужны когда контейнеров надо ахулиард и может оказаться нежелательным задействовать такую массу объектов синхронизации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 09:59:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
vavankealon(Ruslan)хз тока зачем это надо если критическая секция даст тоже самоеlf-контейнеры (кроме прочих их достоинств и преимуществ) могут оказаться нужны когда контейнеров надо ахулиард и может оказаться нежелательным задействовать такую массу объектов синхронизациитут така вещь, что все эти оптимизации уже есть в критической секции и реальных обектов синхронизации не так много создаётся. Фактически, в большинстве случаев срабатывает обычный спин-лок. хотя как вариант возможно неплохое применение на обшаренной между процессами памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 10:38:20 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)все эти оптимизации уже есть в критической секциикрит. секция при всех ее прелестях вещь весьма виндовая а lf без мутексов и т.п. бывают кросс-платформенные kealon(Ruslan)реальных обектов синхронизации не так много создаётсяно создаться таки могут, а уж "если неприятность может случиться то она непременно случится" (С) kealon(Ruslan)Фактически, в большинстве случаев срабатывает обычный спин-локну пока contention/starvation не случатся вообще конкурентов у cs практически нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 11:10:10 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А моя очередь разве не быстрее крит секции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 10:32:27 |
|
||
|
Lock-free: Доведём очередь до ума
|
|||
|---|---|---|---|
|
#18+
А вот это никто не смотрел? http://www.thedelphigeek.com/2010/02/dynamic-lock-free-queue-doing-it-right.html Ну это я так, на правах мимокрокодила :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2017, 10:43:35 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041445]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
155ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 437ms |

| 0 / 0 |
