如何在 Delphi 中自动设置布尔值?

Jou*_*Aro 3 delphi

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

Rem*_*mko 5

DelphiBoolean是字节值,不能与 Atomic API 一起使用,因为它们对 32 位值进行操作。

您可以使用BOOL32 位布尔值代替,如下所示:

var
  b: bool;
begin
  b := False;

  // true
  AtomicIncrement(Integer(b));

  // false
  AtomicDecrement(Integer(b));
Run Code Online (Sandbox Code Playgroud)

然而,递增有点危险,因为递增两次(类似于分配 True 两次)并递减一次意味着该值 > 0,因此仍然True

另一种选择可能是这样的:

  // false
  AtomicExchange(Integer(b), Integer(False));

  // true
  AtomicExchange(Integer(b), Integer(True));
Run Code Online (Sandbox Code Playgroud)