Является ли std:: regex потокобезопасным?
Связано с является ли статический экземпляр boost::wregex потокобезопасным? но для стандартизированной версии. Можно ли вызвать regex_search из нескольких потоков с одним и тем же объектом regex?
2 ответов:
Утверждая, что
std::regexявляется потокобезопасным во всех отношениях-это довольно смелое утверждение. Стандарт C++11 не дает таких гарантий для библиотеки регулярных выражений.Однако, глядя на прототип
std::regex_searchпоказывает, что он принимает объектbasic_regexв качестве аргумента const. Это означает, что он защищен гарантией стандартной библиотеки, что модификатор const подразумевает потокобезопасность функции по отношению к этому аргументу.В стандартный, то есть:
[17.6.5.9/1] Этот раздел определяет требования, которым должны соответствовать реализации для предотвращения гонки данных (1.10). Каждая стандартная библиотечная функция должна удовлетворять каждому требованию, если не указано иное. Реализация может предотвратить гонки данных в случаях, отличных от указанных ниже.
[17.6.5.9/3] Функция стандартной библиотеки C++ не должна прямо или косвенно изменять объекты (1.10), доступные другим потокам. чем текущий поток, если только к объектам не осуществляется прямой или косвенный доступ через аргументы функции non-const, включая
this.Таким образом, за исключением ошибки в реализации стандартной библиотеки, которую вы используете, кажется, что вызовы
std::regex_searchявляются потокобезопасными по отношению к объектуregex, который передается.
Другие мысли:
Только потому, что
std::regex_searchявляется повторным участником по отношению к его аргументуregex, не означает, что вы полностью вышли из воды. Выполнение операции, которая изменяетregexне потокобезопасным способом одновременно с потокобезопасным вызовом, таким какstd::regex_search, все еще не определено.basic_regexs оператор присваивания, std:: swap , иbasic_regex::imbueприходят на ум как не потокобезопасные функции по отношению кbasic_regex, на которых они работают. Зная это, возможно, будет лучше для вас сделать копию объектаregex, которая должна прийти с минимальными затратами на производительность, для каждого нить для использования / модификации на досуге.
В то время как ответ Шона верен для стандарта, индивидуальная реализация может оказаться недостаточной. VC++ 2013, по крайней мере, выглядит так, как будто он имеет условия гонки в своем конструкторе копирования и в лениво вычисляемой переменной.
Comments