Безопасность потоков 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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