我有一个类是TThread的后代。我有一些只读的公共属性。如果我的主线程在线程处于活动状态时读取这些值,我会遇到问题吗?
答案 0 :(得分:8)
如果通过“只读属性”你的意思是TThread后代本身也不会改变它们,并尽快初始化它们,那么不,一切都会好的(只要你确保线程是活着的并且踢无论何时你要求财产价值)。
如果通过“只读属性”表示TThread后代将是唯一更改它们的人,那么您将需要确保主线程在更改时不读取它们(除非它们是原子值,像整数一样。)
答案 1 :(得分:3)
Integer
,Boolean
,Char
和Pointer
等基本类型可随时阅读。只有在其他线程无法同时分配新值时,才能安全地读取引用类型,如string
,接口和动态数组。例如,使用临界区或Synchronized
方法确保线程在主线程读取时不修改该值。
您还必须记住,在您使用它时,您读取的任何值都可能已过期 - 该线程可能在您阅读它的时间和使用它之间写入了新值。
答案 2 :(得分:2)
这取决于属性类型以及可能的访问方法。
type
TMyThread = class(TThread)
private
FIntfield: integer;
public
property IntField: integer read FIntField;
end;
访问此属性不会成为问题,因为访问32位值是原子操作。但是如果属性大于32位或者在主线程访问它时可能会更改的类引用,则会遇到麻烦。