线程安全测试/减少

Rim*_*ire 0 delphi multithreading freepascal lazarus

此代码线程是否安全,或者在执行InterLockedDecrement之前是否可以通过另一个线程更改FCount?

procedure TMyObject.Wait;
begin
  if FCount > 0 then
    InterLockedDecrement(FCount);
  ..
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

代码不是线程安全的.目前,正在对读比赛FCountif声明.

由于我不知道您的代码旨在实现什么,更大的目标是什么,我不会建议解决方案.


Dis*_*ned 5

它不是线程安全的.

  • 线程1读取FCount = 1,将条件计算为True.
  • 线程2读取FCount = 1,将条件计算为True.
  • 线程1将FCount减少为0
  • 线程2将FCount减少为-1

但我认为该代码专门用于防止降低FCount到零以下.

您可能需要考虑以下内容:

if InterlockedDecrement(FCount) < 0 then
  InterlockedIncrement(FCount);
Run Code Online (Sandbox Code Playgroud)

这样,两个并发线程中的一个将值减小为-1,然后"修复其错误".
但是,它确实具有FCount可能暂时存在的副作用< 0.

  • 不,那不是它.问题是`if`中的读取没有同步. (4认同)