2013-04-01 5 views

답변

14

모든 측면에서 std::regex은 스레드로부터 안전하다고 주장하는 것은 꽤 대담한 진술입니다. C++ 11 표준은 정규 표현식 라이브러리에 대한 이러한 보장을하지 않습니다.

그러나 프로토 타입 std::regex_search을 보면 basic_regex 개체가 const 인수로 사용된다는 것을 알 수 있습니다. 이것은 표준 라이브러리가 해당 인수에 대한 함수의 const 수정 자 implies thread-safety을 보장한다는 것을 의미합니다. (1.10)

[17.6.5.9/1] 구현이 섹션은 데이터 레이스를 방지한다 충족 조건을 지정

standardese, 즉이다. 달리 명시되지 않는 한 모든 표준 라이브러리 함수는 각 요구 사항을 충족해야합니다. 구현은 아래 지정된 경우 이외의 경우에 데이터 경합을 방지 할 수 있습니다.

[17.6.5.9/3] C++ 표준 라이브러리 함수를 직접 또는 간접적으로 수정하지 않는다 객체 현재 스레드가 아닌 다른 스레드에서 액세스 (1.10) 객체가 함수의 비를 통해 직접 또는 간접적으로 액세스하지 않는 -const 인수 (this 포함)

그래서, 당신이 사용하는 표준 라이브러리의 구현에 버그를 금지, std::regex_search에 대한 호출이 전달 된 regex 객체에 대한 스레드 안전하다는 것을 나타납니다.


다른 생각 :

그냥 std::regex_searchregex 인수에 대해 다시 참가자는 물 밖으로 완전히 것을 의미하지 않습니다 때문입니다. std::regex_search과 같이 스레드로부터 안전한 호출과 동시에 스레드로부터 안전하지 않은 방식으로 regex을 수정하는 작업을 수행하는 것은 아직 정의되지 않은 동작입니다. basic_regexassignment operator, std::swapbasic_regex::imbue은 작업중인 basic_regex과 관련하여 스레드 안전하지 않은 함수로 사용됩니다. 이 사실을 알고 있다면 regex 개체의 복사본을 만드는 것이 좋을 수 있습니다. 최소한의 성능 비용으로 각 스레드가 여가 시간에 사용/수정해야합니다.

+0

'std :: regex' 인스턴스는 컴파일 된 정규 표현식을 나타내며 regex 컴파일은 값 비싼 프로세스이므로 재사용 할 수 있습니다. 물론 다른 스레드가 이미 그것을 사용하고있는 동안 기존 인스턴스 (std :: regex 또는 다른 것)를 교체/재 할당하는 것은 어리석은 일입니다. – rustyx

1

Sean's answer이 표준에 해당하는 동안 개별 구현이 부족할 수 있습니다. VC++ 2013은 적어도 복사 생성자와 느린 평가 된 변수에 race conditions이있는 것 같습니다.

+0

해당 티켓에 따르면 최근 릴리스 된 VS2015에서 수정해야합니다. –

관련 문제