作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了一个名为EventBus的Delphi库,我认为它将非常有用,因为Observer是我最喜欢的设计模式。
在学习其源代码的过程中,我发现了一段代码,可能是出于多线程安全性考虑,其原因如下(属性Active的getter和setter方法)。
TSubscription = class(TObject)
private
FActive: Boolean;
procedure SetActive(const Value: Boolean);
function GetActive: Boolean;
// ... other members
public
constructor Create(ASubscriber: TObject;
ASubscriberMethod: TSubscriberMethod);
destructor Destroy; override;
property Active: Boolean read GetActive write SetActive;
// ... other methods
end;
function TSubscription.GetActive: Boolean;
begin
TMonitor.Enter(self);
try
Result := FActive;
finally
TMonitor.exit(self);
end;
end;
procedure TSubscription.SetActive(const Value: Boolean);
begin
TMonitor.Enter(self);
try
FActive := Value;
finally
TMonitor.exit(self);
end;
end;
FActive
的锁定保护是否必要,为什么?
最佳答案
概括
让我首先明确指出这一点:不要尝试将多线程开发提炼为一组“简单”规则。必须了解如何共享数据,以便评估哪种可用的并发保护技术将针对特定情况正确为。
您提供的代码表明原始作者仅对多线程开发有一个肤浅的了解。因此,这是而不是要做的一课。
Boolean
以进行读/写访问根本没有用。 IE。每个读取或写入已经是原子的。 Boolean
变量可能需要保护的解释。 $ffff
的现有值上写入$0000
,而另一个线程在读取。 $0000
或$ffff
,具体取决于哪个线程是“第一个”。 $ff00
或$00ff
的无效值。 Boolean
)不能跨越对齐的内存位置。因此,它们不受上述棘手问题的困扰。这就是为什么问题中试图保护Boolean
的代码完全没有意义的原因。FBool := not FBool;
FBool
读到线程本地的位置(堆栈或寄存器)。 FBool
;两者都获得了初始值。 关于multithreading - 是否有必要在Delphi中对 bool 属性进行多线程保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551019/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!