Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Critical Section vs TMonitor / 25 сообщений из 34, страница 1 из 2
07.12.2020, 15:21
    #40025285
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Смотрю тут в исходники TThreadList и возникло у меня два вопроса по методу LockList():

1. Насколько быстрее или медленнее TMonitor.Enter() по сравнению с CriticalSection.Enter(), т.е. почему выбрали именно монитор?
2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)?

Delphi 10.3.1
...
Рейтинг: 0 / 0
07.12.2020, 15:25
    #40025287
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
alekcvp

т.е. почему выбрали именно монитор?
кросс-платформенность же
...
Рейтинг: 0 / 0
07.12.2020, 15:25
    #40025288
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
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.
destructor TThreadList.Destroy;
begin
  LockList;    // Make sure nobody else is inside the list.
  try
    FList.Free;
    inherited Destroy;
  finally
    UnlockList;
    FLock.Free;
  end;
end;
...
Рейтинг: 0 / 0
07.12.2020, 15:26
    #40025289
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
alekcvp

2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)?
Делай TMonitor.Enter(Self) :))
...
Рейтинг: 0 / 0
07.12.2020, 15:27
    #40025290
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Квейд
alekcvp

2. Зачем нужен именно отдельный TObject, почему нельзя использовать сам FList, т.е. делать TMonitor.Enter(FList)?
Делай TMonitor.Enter(Self) :))
ладно, это плохая идея
...
Рейтинг: 0 / 0
07.12.2020, 15:32
    #40025292
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Квейд, критическая секция тоже кроссплатформенная
...
Рейтинг: 0 / 0
07.12.2020, 15:34
    #40025294
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
alekcvp,

1. Насколько я помню, они практически равнозначны. Монитор - потому что кроссплатформенно.
2. Сделали тупо - заменой. Текущий вариант имел бы смысл, если бы лок был разделяемым. Тут скорее уж, .Enter(Self) нужен.
...
Рейтинг: 0 / 0
07.12.2020, 15:47
    #40025303
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Fr0sT-Brutal,

Логично, блин.

Квейд
Квейд
пропущено...
Делай TMonitor.Enter(Self) :))
ладно, это плохая идея

Почему?
...
Рейтинг: 0 / 0
07.12.2020, 16:18
    #40025321
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
alekcvp
Fr0sT-Brutal,

Логично, блин.

Квейд
пропущено...
ладно, это плохая идея

Почему?
Если у тебя один разделяемый ресурс и несколько экземпляров TThread. Self будет разный для всех.
...
Рейтинг: 0 / 0
07.12.2020, 16:21
    #40025322
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Квейд
Если у тебя один разделяемый ресурс и несколько экземпляров TThread. Self будет разный для всех.

Это как? Объект-то один и тот же. Self - это же TList, а не TThread.
...
Рейтинг: 0 / 0
07.12.2020, 17:20
    #40025352
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
cptngrb
критическая секция тоже кроссплатформенная

В Delphi критические секции реализованы через монитор, на платформах отличных от винды.
...
Рейтинг: 0 / 0
07.12.2020, 17:24
    #40025353
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
TMonitor - кроссплатформенный и очень быстрый (при условии, если нет конкуренции за ресурс или она бывает редко). Ускорение при отсутствии многопоточности достигается за счёт отсутствия обращения к системной критической секции (как минимум, отсутствует один вызов в Kernel32.dll, т.е. в ядро ОС с "тяжёлой" операцией переключения контекста).
Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll.

Но в случае, если конкуренция за ресурс происходит очень часто, то реакция на разблокировку ресурса у TMonitor будет дольше (из-за использования идиотского Sleep(1) в цикле ожидания), по сравнению к критической секцией в винде, которая использует Mutex.
...
Рейтинг: 0 / 0
07.12.2020, 17:26
    #40025355
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
DmSer
Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll.

И Рихтера не читал? Они давно на спинах.
...
Рейтинг: 0 / 0
07.12.2020, 17:49
    #40025365
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Kazantsev Alexey
DmSer
Я на самом деле не изучал, происходит ли переход в режим ядра при вызове EnterCriticalSection, но подозреваю, что так, поскольку она находится в Kernel32.dll.

И Рихтера не читал? Они давно на спинах.
Вроде если долго крутится, то все равно уходит в ядро
...
Рейтинг: 0 / 0
07.12.2020, 18:56
    #40025385
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Barmaley57
Вроде если долго крутится, то все равно уходит в ядро

Ну да, после спина переход на мьютекс. Поэтому секциями не рекомендуется делать долгоживущие блокировки. Кстати, у них ещё и таймаут есть т.ч. есть ненулевой шанс влететь на исключение.
...
Рейтинг: 0 / 0
08.12.2020, 08:18
    #40025470
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Kazantsev Alexey, это в смысле, что заменять тип монитор на тип критическая секция ради простой замены было бессмысленно
...
Рейтинг: 0 / 0
08.12.2020, 08:26
    #40025471
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Kazantsev Alexey
Поэтому секциями не рекомендуется делать долгоживущие блокировки.

это как? можно пояснить для тупых?
...
Рейтинг: 0 / 0
08.12.2020, 08:47
    #40025475
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
почитал Рихтера.

РихтерВ действительности потоки, ожидающие освобождения критической секции,
никогда не блокируются «навечно». EnterCriticalSection устроена так, что по
истечении определенного времени, генерирует исключение. После этого Вы
можете подключить к своей программе отладчик и посмотреть, что в ней случилось. Длительность времени ожидания функцией EnterCriticalSection определяется значением параметра CriticalSectionTimeout, который хранится в следующем разделе системного реестра:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
Длительность времени ожидания измеряется в секундах и по умолчанию
равна 2 592 000 секунд (что составляет ровно 30 суток). Не устанавливайте
слишком малое значение этого параметра (например, менее 3 секунд), так как
иначе Вы нарушите работу других потоков и приложений, которые обычно
ждут освобождения критической секции дольше трех секунд

Век живи, век учись.
...
Рейтинг: 0 / 0
08.12.2020, 09:12
    #40025483
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Набросал тесты


Код: 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.
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  cs: TCriticalSection;
  tc: DWORD;
begin
  cs := TCriticalSection.Create;
  tc := GetTickCount;
  for I := 1 to StrToInt(Edit1.Text) do
  begin
    cs.Enter;
    cs.Leave;
  end;
  tc := GetTickCount - tc;
  cs.Free;

  labTCritSecTime.Caption := tc.ToString + ' мс';

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  cs: TRTLCriticalSection;
  I: Integer;
  tc: DWORD;
begin
  InitializeCriticalSection(cs);
  tc := GetTickCount;
  for I := 1 to StrToInt(Edit1.Text) do
  begin
    EnterCriticalSection(cs);
    LeaveCriticalSection(cs)
  end;
  tc := GetTickCount - tc;
  DeleteCriticalSection(cs);
  labRTLCritSecTime.Caption := tc.ToString + ' мс';
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  I: Integer;
  Lock: TObject;
  tc: DWORD;
begin
  Lock := TObject.Create;
  tc := GetTickCount;
  for I := 1 to StrToInt(Edit1.Text) do
  begin
    System.TMonitor.Enter(Lock);
    System.TMonitor.Exit(Lock);
  end;
  tc := GetTickCount - tc;
  Lock.Free;

  labMonitorTime.Caption := tc.ToString + ' мс';
end;




Использовал цикл 100 млн итераций.
Результаты:
TCriticalSection: 1625 мс
TRTLCriticalSection: 1469 мс
TMonitor: 2078 мс

Т.е. все примерно на одном уровне. Большое значение играют дополнительные вызовы методов. В классе TCriticalSection методы объявлены следующим образом:
Код: pascal
1.
2.
    procedure Acquire; override;
    procedure Release; override;


т.е. без директивы inline
Поэтому работает чуть медленнее, чем TRTLCriticalSection.

Похоже, цикл спин-блокировки для крит. секции происходит без переключения в режим ядра.
...
Рейтинг: 0 / 0
08.12.2020, 10:00
    #40025496
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
cptngrb
почитал Рихтера.

РихтерВ действительности потоки, ожидающие освобождения критической секции,
никогда не блокируются «навечно». EnterCriticalSection устроена так, что по
истечении определенного времени, генерирует исключение. После этого Вы
можете подключить к своей программе отладчик и посмотреть, что в ней случилось. Длительность времени ожидания функцией EnterCriticalSection определяется значением параметра CriticalSectionTimeout, который хранится в следующем разделе системного реестра:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
Длительность времени ожидания измеряется в секундах и по умолчанию
равна 2 592 000 секунд (что составляет ровно 30 суток). Не устанавливайте
слишком малое значение этого параметра (например, менее 3 секунд), так как
иначе Вы нарушите работу других потоков и приложений, которые обычно
ждут освобождения критической секции дольше трех секунд


Век живи, век учись.

+100500
даже не знал, что этот параметр настраиваемый.
Думал, он вшит в ядро навечно
...
Рейтинг: 0 / 0
08.12.2020, 10:14
    #40025500
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
cptngrb
это в смысле, что заменять тип монитор на тип критическая секция ради простой замены было бессмысленно

На винде смысл может и есть (если речь о rtlcrtiticalsection), но на других платформах нет.

cptngrb
это как? можно пояснить для тупых?

Если ты знаешь, что ресурс блокируется на длительное время, нужно сразу отказываться от секций в пользу другого механизма, например, мьютекса. Почему? Потому что секции сначала крутят цикл (спин-блокировка) проверяя доступность ресурса, и когда счётчик обнуляется, а ресурс по-прежнему недоступен, секция создаёт мьютекс. В этой ситуации впустую тратятся ресурсы процессора на спин-блокировку.
...
Рейтинг: 0 / 0
08.12.2020, 10:28
    #40025504
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
ну как вариант можно и поменять настройку spin count индивидуально у секции
...
Рейтинг: 0 / 0
08.12.2020, 10:50
    #40025513
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
vavan,

Да, Рихтер пишет, что значение счётчика можно подбирать по ситуации. Но это всё эмпирика, которая может сломаться в других обстоятельствах. У монитора, кстати, значние счётчика тоже настраивается.
...
Рейтинг: 0 / 0
08.12.2020, 12:46
    #40025554
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
Kazantsev Alexey
эмпирика, которая может сломаться в других обстоятельствах
конечно, по возможности лучше вообще без локов
...
Рейтинг: 0 / 0
08.12.2020, 13:06
    #40025560
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Critical Section vs TMonitor
vavan
Kazantsev Alexey
эмпирика, которая может сломаться в других обстоятельствах
конечно, по возможности лучше вообще без локов

Как без локов обращаться к списку, где один поток может читать объект, в то время как другой - удалять его?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Critical Section vs TMonitor / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]