如何在Delphi中原子地设置布尔值?

如何在Delphi中原子地设置布尔值?,delphi,Delphi,AtomicExchange需要整数或NativeInt变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值?或者是否需要它?Delphi布尔值是字节值,不能与原子API一起使用,因为它们对32位值进行操作 您可以使用BOOL,它是一个32位的布尔值,如下所示: var b: bool; begin b := False; // true AtomicIncrement(Integer(b)); // false AtomicDecrement(Intege

AtomicExchange需要整数或NativeInt变量,但我如何使用它(或类似的东西)以线程安全的方式设置布尔值?或者是否需要它?

Delphi
布尔值是字节值,不能与原子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,谢谢。我只想确保值被安全地更改,以防多个远程客户端尝试从不同的线程执行此操作。所以我想我可以相信字节值是安全的。所以我不确定布尔值的大小,但因为它只是字节,所以没关系。