gpt4 book ai didi

delphi - 具有 'thread-safe'读/写操作的Delphi数据类型列表?

转载 作者:行者123 更新时间:2023-12-03 14:40:57 24 4
gpt4 key购买 nike

“ bool ”变量对于从任何线程读写都是线程安全的吗?我看到一些新闻组引用说它们是。还有其他可用的数据类型吗? (枚举类型,也许是短整数?)

如果有一个可以从任何线程安全读取的所有数据类型的列表,以及另一个可以在任何线程中安全写入而无需诉诸各种同步方法的列表,那就太好了。

最佳答案

请注意,您基本上可以使 delphi 中的所有内容都成为非线程安全的。虽然其他人提到 bool 值的对齐问题,但这在某种程度上隐藏了真正的问题。

是的,您可以在任何线程中读取 bool 值,并在任何线程中写入 bool 值(如果正确对齐)。但无论如何,从您更改的 bool 值中读取不一定是“线程安全的”。假设您在更新数字时将 bool 值设置为 true,以便另一个线程读取该数字。

if NumberUpdated then
begin
LocalNumber = TheNumber;
end;

由于优化,处理器使得 TheNumber 可以在读取 NumberUpdated 之前读取,因此即使您上次更新了 NumberUpdated,您也可能会得到 TheNumber 的旧值。

也就是说,您的代码可能会变成:

temp = TheNumber;
if NumberUpdated the
begin
LocalNumber = temp;
end;

恕我直言,基本经验法则:
“读取是线程安全的。写入不是线程安全的。”
因此,如果您要对数据进行写保护,并随处进行同步,那么您会在可能发生写入的同时读取该值。
另一方面,如果您只在一个线程中读取和写入一个值,那么它是线程安全的。因此,您可以在临时位置进行大量写入,然后同步应用程序范围数据的更新。

奖金简介:

VCL 不是线程安全的。将所有对 ui 内容的修改保留在主线程中。也将所有 ui 内容的创建保留在主线程中。

许多函数也不是线程安全的,而其他函数则是线程安全的,它通常取决于底层的 winapi 调用。

我认为“列表”没有帮助,因为“线程安全”可能意味着很多东西。

关于delphi - 具有 'thread-safe'读/写操作的Delphi数据类型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510031/

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