Это не поточно-безопасный.
- Тема 1 читает FCount = 1, оценивает условие на True.
- Тема 2 читает FCount = 1, оценивает условие на True.
- резьба 1 декременты FCount до 0
- Темы 2 декрементирует FCount -1
Тем не менее, я полагаю, код специально предназначен для предотвращения снижения FCount
ниже нуля.
Вы можете рассмотреть следующие вместо:
if InterlockedDecrement(FCount) < 0 then
InterlockedIncrement(FCount);
Таким образом, один из двух параллельных потоков позволит уменьшить значение -1, а затем «исправить свою ошибку».
Однако он имеет побочный эффект, который может быть FCount
временно < 0
.
Посмотреть исходный код из [SyncObjs.TCountdownEvent.Signal] (HTTP: // docwiki.embarcadero.com/Libraries/en/System.SyncObjs.TCountdownEvent.Signal) для примера декремента потокобезопасности. –