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

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

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

т.е. почему выбрали именно монитор?
кросс-платформенность же
...
Рейтинг: 0 / 0
Critical Section vs TMonitor
    #40025288
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Critical Section vs TMonitor
    #40025289
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Код: 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
Critical Section vs TMonitor
    #40025496
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
cptngrb
почитал Рихтера.

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


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

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

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

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

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

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

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


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