2013-07-07 2 views
13

std::regex 개체를 모두 std::sregex_iterator, std::regex_match 등을 사용하는 여러 스레드에서 사용할 수 있습니까? 예를 들어동시 사용 std :: regex, 정의 된 동작?

, 다음과 같은 생산 논리적 행동 것 : 나는 const std::regex를 사용하여 동시에 정의되지 않은 동작이나하지 발생 여부를 명시 아무것도 찾을 수 없습니다

bool SomeFunc(const std::string& szString1, const std::string& szString2) 
{ 
    static const std::regex regexTest("=== ([\\w]+) ===", std::regex_constants::optimize); 

    std::future<bool> f = std::async([](std::string szString) { 
     return std::regex_match(szString, regexTest); 
    }, szString1); 

    bool b = std::regex_match(szString2, regexTest); 

    return (b && f.get()); 
} 

은. 내가 말할 수있는 한, regex 객체에 대한 편집은 일어나지 않으므로 정의되지 않은 동작을 동시에 사용해서는 안된다.

미리 감사드립니다.

답변

19

예, const std::regex은 스레드로부터 안전합니다. 실제로 표준 라이브러리의 모든 const 메서드는 스레드로부터 안전합니다.

§17.6.5.9/3을 참조하십시오. C++ 표준 라이브러리 함수는 현재 스레드가 아닌 스레드가 직접적으로 또는 간접적으로 함수의 비 const 인수를 통해 액세스하지 않는 한 직접적으로 또는 간접적으로 개체 (1.10)를 수정할 수 없습니다.

+0

감사합니다. 방금 확인을 원했어. –

+0

@ronag 왜이 사양을 선택했는지 대답을 설명해 주시겠습니까? 또한 C++ 표준 라이브러리의 일부가 아닌 클래스를 사용하여이 작업을 수행하는 방법은 무엇입니까? 나는 당신이 그 질문에 대답 할 수있는 시간을 찾을 수 있기를 바랍니다! :) – Tim

+0

@Tim "_ C++ 표준 라이브러리의 일부가 아닌 클래스로 어떻게 이것을 구현할 수 있습니까? _"귀하의 질문을 이해할 수 없습니다 ... – curiousguy