首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全测试/减量

线程安全测试/减量
EN

Stack Overflow用户
提问于 2015-07-23 14:26:06
回答 3查看 170关注 0票数 0

这是代码线程安全,还是FCount在执行InterLockedDecrement之前可以被另一个线程更改?

代码语言:javascript
复制
procedure TMyObject.Wait;
begin
  if FCount > 0 then
    InterLockedDecrement(FCount);
  ..
end;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-23 14:42:17

这不安全。

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

但是,我假设代码是专门用来防止FCount降到零以下的。

您可能需要考虑以下几点:

代码语言:javascript
复制
if InterlockedDecrement(FCount) < 0 then
  InterlockedIncrement(FCount);

这样,两个并发线程中的一个将值减少到-1,然后“修复它的错误”。

然而,它确实有副作用,FCount可能暂时是< 0.

票数 5
EN

Stack Overflow用户

发布于 2015-07-23 14:32:10

代码不是线程安全。在FCount语句中对if的读取进行了一次竞赛。

因为我不知道您的代码打算实现什么,更大的目标是什么,所以我不会提出解决方案。

票数 5
EN

Stack Overflow用户

发布于 2015-07-24 07:17:59

这并不像其他人指出的那样是安全的。如果要确保代码减少了FCount的值,如果它大于0,那么您可以使用这样的代码,而不需要锁定:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31590245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档