这是代码线程安全,还是FCount在执行InterLockedDecrement之前可以被另一个线程更改?
procedure TMyObject.Wait;
begin
if FCount > 0 then
InterLockedDecrement(FCount);
..
end;发布于 2015-07-23 14:42:17
这不安全。
但是,我假设代码是专门用来防止FCount降到零以下的。
您可能需要考虑以下几点:
if InterlockedDecrement(FCount) < 0 then
InterlockedIncrement(FCount);这样,两个并发线程中的一个将值减少到-1,然后“修复它的错误”。
然而,它确实有副作用,FCount可能暂时是< 0.
发布于 2015-07-23 14:32:10
代码不是线程安全。在FCount语句中对if的读取进行了一次竞赛。
因为我不知道您的代码打算实现什么,更大的目标是什么,所以我不会提出解决方案。
发布于 2015-07-24 07:17:59
这并不像其他人指出的那样是安全的。如果要确保代码减少了FCount的值,如果它大于0,那么您可以使用这样的代码,而不需要锁定:
procedure TMyObject.Wait;
var
count: Integer;
countPlus1: Integer;
begin
repeat
count := FCount;
if (count > 0) then
begin
countPlus1 := count;
Dec(count);
end;
until (count <= 0) or (InterlockedCompareExchange(FCount, count, countPlus1) = countPlus1);
..
end;https://stackoverflow.com/questions/31590245
复制相似问题