AtomicExchange要求一个Integer或NativeInt变量,但是我如何使用它(或类似的东西)以线程安全的方式设置布尔值 - 或者是否有这样的需要?
AtomicExchange要求一个Integer或NativeInt变量,但是我如何使用它(或类似的东西)以线程安全的方式设置布尔值 - 或者是否有这样的需要?
Delphi中的Boolean
是一个字节值,不能与原子API一起使用,因为它们是基于32位值操作的。
您可以改用BOOL
,它是一个32位布尔值,如下所示:
var
b: bool;
begin
b := False;
// true
AtomicIncrement(Integer(b));
// false
AtomicDecrement(Integer(b));
然而,增加值的操作有一定的风险,因为如果将其增加两次(类似于两次赋值为True)并减少一次,则该值仍然是True
,且大于0。
另一个替代方案可能是:
// false
AtomicExchange(Integer(b), Integer(False));
// true
AtomicExchange(Integer(b), Integer(True));
Boolean
是一个单字节。对于简单的只读和只写操作,直接访问变量并让系统处理原子访问即可,没有必要手动使用原子API访问Boolean
。仅当您需要一起执行多个操作(先读后写、先写后读)时,才需要协调原子访问以确保值的完整性。然而,单字节数据类型没有原子API。您可以使用同步对象(如TCriticalSection
、TMutex
、TMREWSync
等)来代替。 - Remy Lebeau