Related to Is a static boost::wregex instance thread-safe? but for the standarized version. Can I call regex_search from several threads with the same regex object?
While Sean's answer is true of the standard, individual implementation may fall short. VC++ 2013, at least, looks like it has race conditions in its copy constructor and in a lazily evaluated variable.
Claiming that std::regex is thread-safe in every respect is a pretty bold statement. The C++11 standard does not make such guarantees for the regex library.
However, looking at the prototype of std::regex_search shows that it it takes the basic_regex
object as a const argument. This means that it is protected by the standard library's guarantee that the const modifier implies thread-safety of the function with respect to that argument.
In standardese, that is:
[17.6.5.9/1] This section specifies requirements that implementations shall meet to prevent data races (1.10). Every standard library function shall meet each requirement unless otherwise specified. Implementations may prevent data races in cases other than those specified below.
[17.6.5.9/3] A C++ standard library function shall not directly or indirectly modify objects (1.10) accessible by threads other than the current thread unless the objects are accessed directly or indirectly via the function’s non-const arguments, including
this
.
So, barring a bug in the implementation of the standard library that you use, it appears that calls to std::regex_search
are thread-safe with respect to the regex
object that is passed in.
Other thoughts:
Just because std::regex_search
is re-entrant with respect to its regex
argument does not mean that you are completely out of the water. Performing an operation that modifies a regex
in a non-thread-safe manner at the same time as a thread-safe call such as std::regex_search
is still undefined behaviour. basic_regex
's assignment operator, std::swap, and basic_regex::imbue come to mind as non-thread-safe functions with respect to the basic_regex
they operate on. Knowing this, it might be better for you to make a copy of the regex
object, which should come at a minimal performance cost, for each thread to use/modify at its leisure.