Home All Groups Group Topic Archive Search About

Are Regex objects thread-safe?

Author
26 Oct 2006 12:18 AM
mnowosad
The MSDN documentation about the Regex class seems to have contradictory
information. At the "Remarks" section, the documentation states:

"The Regex class is immutable (read-only) and is inherently thread safe.
Regex objects can be created on any thread and shared between threads. "

However, on the "Thread Safety" section of the same class, the documentation
states:

"Any public static (Shared in Visual Basic) members of this type are thread
safe. Any instance members are not guaranteed to be thread safe.".

So, for instance, if i have an instance of Regex and the only method I will
ever call on it is the instance method "IsMatch()", to validate text input,
can I share this instance across different threads? Can multiple threads
concurrently call "IsMatch()" method on this Regex instance without any major
problem? Or do I need to serialize the calls to "IsMatch()" method in this
case, using the "lock" statement?

Author
26 Oct 2006 1:07 AM
Carl Daniel [VC++ MVP]
mnowosad wrote:
Show quote
> The MSDN documentation about the Regex class seems to have
> contradictory information. At the "Remarks" section, the
> documentation states:
>
> "The Regex class is immutable (read-only) and is inherently thread
> safe. Regex objects can be created on any thread and shared between
> threads. "
>
> However, on the "Thread Safety" section of the same class, the
> documentation states:
>
> "Any public static (Shared in Visual Basic) members of this type are
> thread safe. Any instance members are not guaranteed to be thread
> safe.".

This is boilerplate text that doesn't apply to Regex and should be removed
from this doc page.

> So, for instance, if i have an instance of Regex and the only method
> I will ever call on it is the instance method "IsMatch()", to
> validate text input, can I share this instance across different
> threads?

Yes.

> Can multiple threads concurrently call "IsMatch()" method on
> this Regex instance without any major problem?

Yes.

> Or do I need to
> serialize the calls to "IsMatch()" method in this case, using the
> "lock" statement?

No, no need for anything like that.

-cd
Author
26 Oct 2006 7:46 AM
mnowosad
Hi Carl,

Thanks for the helpful answer. Yes, Microsoft should rephrase the standard
"Thread Safety" section for classes like Regex. It is confusing and
misleading.

Marcos

Show quote
"Carl Daniel [VC++ MVP]" wrote:

> mnowosad wrote:
> > The MSDN documentation about the Regex class seems to have
> > contradictory information. At the "Remarks" section, the
> > documentation states:
> >
> > "The Regex class is immutable (read-only) and is inherently thread
> > safe. Regex objects can be created on any thread and shared between
> > threads. "
> >
> > However, on the "Thread Safety" section of the same class, the
> > documentation states:
> >
> > "Any public static (Shared in Visual Basic) members of this type are
> > thread safe. Any instance members are not guaranteed to be thread
> > safe.".
>
> This is boilerplate text that doesn't apply to Regex and should be removed
> from this doc page.
>
> > So, for instance, if i have an instance of Regex and the only method
> > I will ever call on it is the instance method "IsMatch()", to
> > validate text input, can I share this instance across different
> > threads?
>
> Yes.
>
> > Can multiple threads concurrently call "IsMatch()" method on
> > this Regex instance without any major problem?
>
> Yes.
>
> > Or do I need to
> > serialize the calls to "IsMatch()" method in this case, using the
> > "lock" statement?
>
> No, no need for anything like that.
>
> -cd
>
>
>

AddThis Social Bookmark Button