11

Two separate questions here really: Can I use regexes in a multithreaded program without locking and, if so, can I use the same regex_t at the same time in multiple threads? I can't find an answer on Google or the manpages.

Alex
  • 111
  • 3

2 Answers2

8

http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html

2.9.1 Thread-Safety

All functions defined by this volume of POSIX.1-2008 shall be thread-safe, except that the following functions1 need not be thread-safe.

...

regexec and regcomp are not in that list, so they are required to be thread-safe.

See also: http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html

Part of the rationale text reads:

The interface is defined so that the matched substrings rm_sp and rm_ep are in a separate regmatch_t structure instead of in regex_t. This allows a single compiled RE to be used simultaneously in several contexts; in main() and a signal handler, perhaps, or in multiple threads of lightweight processes.

R.. GitHub STOP HELPING ICE
  • 208,859
  • 35
  • 376
  • 711
-1

Can I use regexes in a multithreaded program without locking

Different ones, yes.

can I use the same regex_t at the same time in multiple threads?

In general: If you plan on doing so, you will have to do the locking around the functions, since few data structures do the locking for you.

regexec: Since regexec however takes a const regex_t, executing regexec seems safe for concurrent execution without locking. (After all, this is POSIX.1-2001, where stupid stuff like static buffers as used in the early BSD APIs usually don't occur anymore.)

user502515
  • 4,346
  • 24
  • 20
  • Note that it's explicitly stated by POSIX to be safe to use the same regex in multiple threads, and the reason it was designed that way is mentioned in the rationale. – R.. GitHub STOP HELPING ICE Apr 29 '12 at 20:24
  • From the regexec man page: "The compiled form is not altered during execution of regexec(), so a single compiled RE can be used simultaneously by multiple threads." – ctpenrose May 10 '12 at 22:41