ここで 2 つの個別の質問があります。ロックせずにマルチスレッド プログラムで正規表現を使用できますか。また、そうであれば、複数のスレッドで同時に同じ regex_t を使用できますか? Googleまたはマンページで答えが見つかりません。
2 に答える
http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html
2.9.1 スレッドセーフ
POSIX.1-2008 のこのボリュームで定義されているすべての関数は、スレッドセーフである必要がありますが、次の関数1 はスレッドセーフである必要はありません。
...
regexec
およびregcomp
そのリストにないため、スレッドセーフである必要があります。
参照: http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html
根拠テキストの一部は次のとおりです。
インターフェイスは、一致した部分文字列 rm_sp と rm_ep が regex_t ではなく別の regmatch_t 構造体にあるように定義されています。これにより、単一のコンパイル済み RE を複数のコンテキストで同時に使用できます。おそらく main() とシグナルハンドラ、または軽量プロセスの複数のスレッドで。
ロックせずにマルチスレッドプログラムで正規表現を使用できますか
違うものです、はい。
複数のスレッドで同時に同じ regex_t を使用できますか?
一般に: そうする予定がある場合は、ロックを行うデータ構造がほとんどないため、関数をロックする必要があります。
regexec: ただし、regexec は regex_t を使用するため、const
regexec の実行は、ロックなしで同時実行しても安全と思われます。(結局のところ、これは POSIX.1-2001 であり、初期の BSD API で使用されていた静的バッファーのような愚かなものは通常、もはや発生しません。)