线程安全例程在线程类之外

时间:2011-06-24 20:26:34

标签: multithreading delphi thread-safety

如果你有一个调用函数的线程,AFAIK它是任何全局或VCL组件调用,这使得它不是线程安全的吗?

因此,如果您的线程调用类似

的方法
procedure UpdateRow()
begin
    StringGrid1.AddRow(....);
end;

这不是线程安全的。 但是如果你有这样的方法

function ParseXML(const XML : String) : string;
var
    xml_parser : TXMLParser;
begin
    xml_parser := TXMLParser.create;
    ... do stuff
    result := xml_parser.something;
    xml_parser.free;
end;

这是线程安全的,只要TXMLParser没有做任何unthread安全的事情。

但是如果两个线程同时调用该方法,它不会抛出异常,因为它们都创建了自己的TXMLParser实例吗?他们得到自己的副本。这是对的吗?

希望有道理:)

2 个答案:

答案 0 :(得分:7)

是的,这是正确的。

答案 1 :(得分:0)

实际上,它可能是正确的,但并非必须如此。如果TXMLParser也使用了一些非线程安全的全局变量,那么这段代码也不会是线程安全的!不鼓励使用全局变量,但是Delphi有很多内置变量,当它们被修改并从不同的线程读取时可能会引起问题。
例如,单位xmldom有两个全局变量:DefaultDOMVendorDOMVendors。这些并没有经常修改,因此应该安全使用 SysUtils单元还有一些全局变量,用于确定当前的语言环境,日期/时间格式等等。这些也不是线程安全的,尽管这些也几乎从未被修改过 甚至第三方代码也可能将全局变量用于各种目的。一些更现代的代码甚至可能使用类变量,这也是一种全局变量,因此肯定线程安全,尽管风险是基于数据的次数被修改......

不看TXmlParser的代码,不清楚它是否是线程安全的。如果它使用像Libxml2.dll这样的第三方DLL,那么它变得更加复杂,因为此DLL的句柄可能存储在全局变量中,因此变得不安全。

然后再说,你说TXmlParser是线程安全的。要回答你的问题:只要“Do stuff”部分是线程安全的,你的代码就会是线程安全的。

相关问题