Фон : приложение, с которым я сталкивался, использует 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 поточно-ориентированным?