Является ли System.RegularExpressions.TRegEx поточно-ориентированным? - PullRequest
0 голосов
/ 27 октября 2018

Фон : приложение, с которым я сталкивался, использует TRegEx синглтон из нескольких потоков.Синглтон инициализируется в TRegEx.Create(Pattern, [roCompiled]) в конструкторе класса, и потоки используют его, начиная с RegEx.Match(Value).Groups, и механизм синхронизации, похоже, не используется, однако приложение работает нормально.Тем не менее, это лишь небольшая часть переопределения TThread.Execute и небольшая нагрузка на потоки.Так что это всегда могло сработать просто случайно, поскольку потоки вряд ли пересекутся друг с другом в критической части.

Мысли : С одной стороны, если подумать об этом, это может привести кчувствую, что экземпляр TRegEx будет содержать только неизменный (скомпилированный) шаблон и будет работать непосредственно с вводом параметров, или сохранит этот ввод в (TMatch) возвращаемых значениях для возможного более позднего продолжения - как с NextMatch, дляпример, который реализован на TMatch, а не на TRegEx базовая библиотека PCRE с открытым исходным кодом, по-видимому, является поточно-ориентированной .Все это соответствует сценарию выше.С другой стороны, я думаю, что экземпляр TRegEx, как правило, не является потокобезопасным, поскольку, например, в function TRegEx.Match(const Input: String): TMatch (как использовалось выше) выглядит так, как будто строка, сопоставляемая с шаблоном, сначала сохраняется в экземпляре.до сопоставления.И тот же вложенный экземпляр TPerlRegEx передается и поддерживается во всех цепочках функций.Общий экземпляр TRegEx, по-видимому, должен быть защищен от несогласованного доступа, например, с критическим разделом.

При этом я подозреваю, что TRegEx не является поточно-ориентированным, ноЯ хотел бы попросить кого-то знающего в многопоточности и в оценке безопасности потока для подтверждения.Следовательно, мой вопрос - очень общий и независимый от приложения, из которого он возник:

Вопрос : Является ли TRegEx поточно-ориентированным?

...