Boost Regex++はリージョンオブジェクトさえ別々なら正規表現オブジェクトは複数スレッドで
共有していい仕様になってた希ガス

extern int
onig_search(regex_t* reg, UChar* str, UChar* end,
UChar* start, UChar* range, OnigRegion* region, OnigOptionType option)
{
int r;
UChar *s, *prev;
MatchArg msa;

if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {
reg->state++; /* increment as search counter */
if (IS_NOT_NULL(reg->chain)) {
onig_chain_reduce(reg);
reg->state++;
}
}
(以下略)

最初の数行だけで明らかにヤバイっしょ。
排他ロックかけるか、パターンのコピーをとらなきゃいけないんだが、
前者はやりたくないし、後者はパターンのコピーをする関数が見つからない。

実はC++ラッパー作ろうとしてるんだけど、コピーをどうやって実装しようか
悩んでいる。

クラスオブジェクトに元の文字列を含めておいて、コピーコンストラクタで文字列をコピーする形にして
その都度onig_newって手もあるんだけど、それって結構ダサい実装じゃね。