Потокобезопасные подпрограммы вне класса потока - PullRequest
2 голосов
/ 25 июня 2011

Если у вас есть поток, который вызывает функцию, 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 не делает ничего небезопасного.

Но если два потока вызывают этот метод одновременно, он не вызовет исключения, поскольку они оба создают свой собственный экземпляр TXMLParser, верно? Они получают свою собственную копию. Это правильно?

Надеюсь, что имеет смысл:)

Ответы [ 2 ]

7 голосов
/ 25 июня 2011

Да, это правильно.

0 голосов
/ 27 июня 2011

На самом деле, это может быть правильно, но не обязательно. Если TXMLParser также использует некоторую глобальную переменную, которая не является потокобезопасной, этот код также не будет потокобезопасным! Использование глобальных переменных не рекомендуется, но в Delphi довольно много встроенных переменных, которые могут вызвать проблемы при их изменении и чтении из разных потоков.
Например, блок xmldom имеет две глобальные переменные: DefaultDOMVendor и DOMVendors. Они не часто модифицируются, поэтому должны быть безопасны в использовании.
Модуль SysUtils также имеет несколько глобальных переменных, используемых для определения текущей локали, форматов даты / времени и прочего. Они также не являются поточно-ориентированными, хотя они почти никогда не модифицируются.
Даже сторонний код может использовать глобальные переменные для любых целей. Некоторый более современный код мог бы даже использовать переменные класса , которые также были бы своего рода глобальными переменными и, следовательно, определенно не поточно-ориентированными, хотя риски основаны на количестве изменений данных ...

Без просмотра кода TXmlParser неясно, является ли он потокобезопасным или нет. Если он использует стороннюю DLL, такую ​​как Libxml2.dll, то это становится еще более сложным, поскольку дескриптор этой DLL может храниться в глобальной переменной, что становится небезопасным.

Опять же, вы сказали, что TXmlParser является поточно-ориентированным. Чтобы ответить на ваш вопрос: ваш код в этом случае будет также потокобезопасным, если часть «Делать вещи» является поточно-ориентированной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...