Безопасность потоков Delphi Linux TEvent.SetEventLinux

Anonymous
Безопасность потоков Delphi Linux TEvent.SetEvent

Сообщение Anonymous »

В Delphi для Linux TEvent.SetEvent реализуется как:
procedure TEvent.SetEvent;
var
I: Integer;
begin
sem_getvalue(FEvent, I);
if I = 0 then
sem_post(FEvent);
end;

Хотя sem_getvalue сам по себе является потокобезопасным, но согласно документации Linux: https://man7.org/linux/man-pages/man3/s ... lue.3.html, значение может измениться после этого (очевидно), это скорее снимок значения.
Если у меня есть несколько потоков, ожидающих одного и того же объекта события, не будет ли у SetEvent проблемы с безопасностью потоков, это значение произойдет быть ненулевым, и `WaitFor` может пропустить некоторые запущенные события?
Кроме того, в Windows и macOS SetEvent напрямую вызывает API ОС, в котором этой проблемы нет. Почему реализация Linux нуждается в дополнительной проверке?
procedure TEvent.SetEvent;
{$IFDEF MSWINDOWS}
begin
Winapi.Windows.SetEvent(Handle);
end;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
begin
dispatch_semaphore_signal(FEvent);
end;
{$ENDIF MACOS}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ead-safety

Вернуться в «Linux»