Безопасность потоков 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 ОС, в котором этой проблемы нет:

Код: Выделить всё

procedure TEvent.SetEvent;
{$IFDEF MSWINDOWS}
begin
Winapi.Windows.SetEvent(Handle);
end;
{$ENDIF MSWINDOWS}
{$IFDEF MACOS}
begin
dispatch_semaphore_signal(FEvent);
end;
{$ENDIF MACOS}
...
Почему реализация Linux нуждается в дополнительной проверке?


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

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

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

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

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

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