|
|
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Смотрю тут в исходники TThreadList и возникло у меня два вопроса по методу LockList(): 1. Насколько быстрее или медленнее TMonitor.Enter() по сравнению с CriticalSection.Enter(), т.е. почему выбрали именно монитор? 2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)? Delphi 10.3.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:21 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
alekcvp т.е. почему выбрали именно монитор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:25 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
alekcvp Смотрю тут в исходники TThreadList и возникло у меня два вопроса по методу LockList(): 1. Насколько быстрее или медленнее TMonitor.Enter() по сравнению с CriticalSection.Enter(), т.е. почему выбрали именно монитор? 2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)? Delphi 10.3.1 1 - протести сам. До ~хе2 монитор был очень тормознутый, но его допилили 2 - возможно, из-за этого Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:25 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
alekcvp 2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:26 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Квейд alekcvp 2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:27 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Квейд, критическая секция тоже кроссплатформенная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:32 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
alekcvp, 1. Насколько я помню, они практически равнозначны. Монитор - потому что кроссплатформенно. 2. Сделали тупо - заменой. Текущий вариант имел бы смысл, если бы лок был разделяемым. Тут скорее уж, .Enter(Self) нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:34 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal, Логично, блин. Квейд Квейд пропущено... Делай TMonitor.Enter(Self) :)) Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 15:47 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
alekcvp Fr0sT-Brutal, Логично, блин. Квейд пропущено... ладно, это плохая идея Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 16:18 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Квейд Если у тебя один разделяемый ресурс и несколько экземпляров TThread. Self будет разный для всех. Это как? Объект-то один и тот же. Self - это же TList, а не TThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 16:21 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
cptngrb критическая секция тоже кроссплатформенная В Delphi критические секции реализованы через монитор, на платформах отличных от винды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 17:20 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
TMonitor - кроссплатформенный и очень быстрый (при условии, если нет конкуренции за ресурс или она бывает редко). Ускорение при отсутствии многопоточности достигается за счёт отсутствия обращения к системной критической секции (как минимум, отсутствует один вызов в Kernel32.dll, т.е. в ядро ОС с "тяжёлой" операцией переключения контекста). Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll. Но в случае, если конкуренция за ресурс происходит очень часто, то реакция на разблокировку ресурса у TMonitor будет дольше (из-за использования идиотского Sleep(1) в цикле ожидания), по сравнению к критической секцией в винде, которая использует Mutex. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 17:24 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
DmSer Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll. И Рихтера не читал? Они давно на спинах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 17:26 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey DmSer Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll. И Рихтера не читал? Они давно на спинах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 17:49 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Barmaley57 Вроде если долго крутится, то все равно уходит в ядро Ну да, после спина переход на мьютекс. Поэтому секциями не рекомендуется делать долгоживущие блокировки. Кстати, у них ещё и таймаут есть т.ч. есть ненулевой шанс влететь на исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2020, 18:56 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, это в смысле, что заменять тип монитор на тип критическая секция ради простой замены было бессмысленно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 08:18 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Поэтому секциями не рекомендуется делать долгоживущие блокировки. это как? можно пояснить для тупых? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 08:26 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
почитал Рихтера. РихтерВ действительности потоки, ожидающие освобождения критической секции, никогда не блокируются «навечно». EnterCriticalSection устроена так, что по истечении определенного времени, генерирует исключение. После этого Вы можете подключить к своей программе отладчик и посмотреть, что в ней случилось. Длительность времени ожидания функцией EnterCriticalSection определяется значением параметра CriticalSectionTimeout, который хранится в следующем разделе системного реестра: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager Длительность времени ожидания измеряется в секундах и по умолчанию равна 2 592 000 секунд (что составляет ровно 30 суток). Не устанавливайте слишком малое значение этого параметра (например, менее 3 секунд), так как иначе Вы нарушите работу других потоков и приложений, которые обычно ждут освобождения критической секции дольше трех секунд Век живи, век учись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 08:47 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Набросал тесты Код: 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. Использовал цикл 100 млн итераций. Результаты: TCriticalSection: 1625 мс TRTLCriticalSection: 1469 мс TMonitor: 2078 мс Т.е. все примерно на одном уровне. Большое значение играют дополнительные вызовы методов. В классе TCriticalSection методы объявлены следующим образом: Код: pascal 1. 2. т.е. без директивы inline Поэтому работает чуть медленнее, чем TRTLCriticalSection. Похоже, цикл спин-блокировки для крит. секции происходит без переключения в режим ядра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 09:12 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
cptngrb почитал Рихтера. РихтерВ действительности потоки, ожидающие освобождения критической секции, никогда не блокируются «навечно». EnterCriticalSection устроена так, что по истечении определенного времени, генерирует исключение. После этого Вы можете подключить к своей программе отладчик и посмотреть, что в ней случилось. Длительность времени ожидания функцией EnterCriticalSection определяется значением параметра CriticalSectionTimeout, который хранится в следующем разделе системного реестра: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager Длительность времени ожидания измеряется в секундах и по умолчанию равна 2 592 000 секунд (что составляет ровно 30 суток). Не устанавливайте слишком малое значение этого параметра (например, менее 3 секунд), так как иначе Вы нарушите работу других потоков и приложений, которые обычно ждут освобождения критической секции дольше трех секунд Век живи, век учись. +100500 даже не знал, что этот параметр настраиваемый. Думал, он вшит в ядро навечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 10:00 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
cptngrb это в смысле, что заменять тип монитор на тип критическая секция ради простой замены было бессмысленно На винде смысл может и есть (если речь о rtlcrtiticalsection), но на других платформах нет. cptngrb это как? можно пояснить для тупых? Если ты знаешь, что ресурс блокируется на длительное время, нужно сразу отказываться от секций в пользу другого механизма, например, мьютекса. Почему? Потому что секции сначала крутят цикл (спин-блокировка) проверяя доступность ресурса, и когда счётчик обнуляется, а ресурс по-прежнему недоступен, секция создаёт мьютекс. В этой ситуации впустую тратятся ресурсы процессора на спин-блокировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 10:14 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
ну как вариант можно и поменять настройку spin count индивидуально у секции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 10:28 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
vavan, Да, Рихтер пишет, что значение счётчика можно подбирать по ситуации. Но это всё эмпирика, которая может сломаться в других обстоятельствах. У монитора, кстати, значние счётчика тоже настраивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 10:50 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey эмпирика, которая может сломаться в других обстоятельствах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 12:46 |
|
||
|
Critical Section vs TMonitor
|
|||
|---|---|---|---|
|
#18+
vavan Kazantsev Alexey эмпирика, которая может сломаться в других обстоятельствах Как без локов обращаться к списку, где один поток может читать объект, в то время как другой - удалять его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2020, 13:06 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40025321&tid=2037794]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 452ms |

| 0 / 0 |
