Код: Выделить всё
procedure TEvent.SetEvent;
var
I: Integer;
begin
sem_getvalue(FEvent, I);
if I = 0 then
sem_post(FEvent);
end;
Если у меня есть несколько потоков, ожидающих одного и того же объекта события, 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}
...
Подробнее здесь: https://stackoverflow.com/questions/798 ... ead-safety
Мобильная версия