gpt4 book ai didi

multithreading - 线程可以安全地读取VCL事件设置的变量吗?

转载 作者:行者123 更新时间:2023-12-03 15:07:19 25 4
gpt4 key购买 nike

线程读取由 Delphi VCL 事件设置的变量是否安全?

当用户单击 VCL TCheckbox 时,主线程将 bool 值设置为复选框的选中状态。

CheckboxState := CheckBox1.Checked;

任何时候,线程都会读取该变量

if CheckBoxState then ...

线程是否“错过”对 bool 值的更改并不重要,因为线程会像执行其他操作一样检查循环中的变量。所以它最终会看到状态改变......

这安全吗?或者我需要特殊的代码吗?使用关键代码调用围绕变量的读取和写入(分别在线程和主线程中)是否必要且充分?

正如我所说,线程是否获得“错误”值并不重要,但我一直认为,如果一个线程尝试在主线程处于主线程中时读取变量,则可能会出现低级问题。写到一半,反之亦然。

我的问题与此类似:Cross thread reading of a variable who's value is not considered important

(也与我之前的问题相关:Using EnterCriticalSection in Thread to update VCL label)

最佳答案

这是安全的,原因如下:

  • 只有一个线程写入该变量。

  • 变量只有一个字节,因此无法读取不一致的值。它将被读取为 TrueFalse。 Delphi boolean 值不会出现对齐问题。

  • Delphi 编译器不会广泛检查变量是否实际被写入,如果没有,也不会“优化”任何代码。非局部变量将始终被读取,不需要 volatile 说明符。

话虽如此,如果您确实对此不确定,您可以使用整数值而不是 bool 值,并使用 InterlockedExchange()函数写入变量。这在这里有点矫枉过正,但这是一个值得了解的好技术,因为对于单机器字大小的值,它可能消除对锁的需要。

您还可以用适当的同步原语(例如事件)替换 bool 值,并在其上设置线程 block - 这将帮助您消除线程中的繁忙循环。

关于multithreading - 线程可以安全地读取VCL事件设置的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2600664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com