如何在Delphi中原子地设置布尔值?
AtomicExchange需要整数或NativeInt变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值?或者是否需要它?Delphi如何在Delphi中原子地设置布尔值?,delphi,Delphi,AtomicExchange需要整数或NativeInt变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值?或者是否需要它?Delphi布尔值是字节值,不能与原子API一起使用,因为它们对32位值进行操作 您可以使用BOOL,它是一个32位的布尔值,如下所示: var b: bool; begin b := False; // true AtomicIncrement(Integer(b)); // false AtomicDecrement(Intege
布尔值是字节值,不能与原子API一起使用,因为它们对32位值进行操作
您可以使用BOOL
,它是一个32位的布尔值,如下所示:
var
b: bool;
begin
b := False;
// true
AtomicIncrement(Integer(b));
// false
AtomicDecrement(Integer(b));
但是,递增有点危险,因为递增两次(类似于赋值两次True),递减一次意味着值大于0,因此仍然True
另一种选择可能是:
// false
AtomicExchange(Integer(b), Integer(False));
// true
AtomicExchange(Integer(b), Integer(True));
这取决于你想做什么。如果要切换该值,则需要一个AtomicXXX函数,并且需要使用32位布尔值。但是,如果您只想将值设置为特定值,而不需要读取,那么您可以直接使用普通赋值。对于简单的只读和只读操作,只需直接访问变量并让系统为您处理原子访问,无需手动使用原子API访问布尔值。只有当您需要一起执行多个操作(先读后写,先写后读)时,才需要协调原子访问以确保值的完整性。但是,单字节数据类型没有原子API。您可以只使用同步对象,例如TCriticalSection
,TMutex
,tRewSync
,etc@Remy在32位类型上使用原子操作更有效OK,谢谢。我只想确保值被安全地更改,以防多个远程客户端尝试从不同的线程执行此操作。所以我想我可以相信字节值是安全的。所以我不确定布尔值的大小,但因为它只是字节,所以没关系。