Является ли std:: regex потокобезопасным?



Связано с является ли статический экземпляр boost::wregex потокобезопасным? но для стандартизированной версии. Можно ли вызвать regex_search из нескольких потоков с одним и тем же объектом regex?

648   2  

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_regex s оператор присваивания, std:: swap , и basic_regex::imbue приходят на ум как не потокобезопасные функции по отношению к basic_regex, на которых они работают. Зная это, возможно, будет лучше для вас сделать копию объекта regex, которая должна прийти с минимальными затратами на производительность, для каждого нить для использования / модификации на досуге.

В то время как ответ Шона верен для стандарта, индивидуальная реализация может оказаться недостаточной. VC++ 2013, по крайней мере, выглядит так, как будто он имеет условия гонки в своем конструкторе копирования и в лениво вычисляемой переменной.

Comments

    Ничего не найдено.