Is a static boost::wregex instance thread-safe?과 관련이 있지만 표준화 버전의 경우. regex_search를 같은 regex 객체로 여러 스레드에서 호출 할 수 있습니까?std :: regex 스레드가 안전합니까?
답변
모든 측면에서 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_search
가 regex
인수에 대해 다시 참가자는 물 밖으로 완전히 것을 의미하지 않습니다 때문입니다. std::regex_search
과 같이 스레드로부터 안전한 호출과 동시에 스레드로부터 안전하지 않은 방식으로 regex
을 수정하는 작업을 수행하는 것은 아직 정의되지 않은 동작입니다. basic_regex
의 assignment operator, std::swap 및 basic_regex::imbue
은 작업중인 basic_regex
과 관련하여 스레드 안전하지 않은 함수로 사용됩니다. 이 사실을 알고 있다면 regex
개체의 복사본을 만드는 것이 좋을 수 있습니다. 최소한의 성능 비용으로 각 스레드가 여가 시간에 사용/수정해야합니다.
Sean's answer이 표준에 해당하는 동안 개별 구현이 부족할 수 있습니다. VC++ 2013은 적어도 복사 생성자와 느린 평가 된 변수에 race conditions이있는 것 같습니다.
해당 티켓에 따르면 최근 릴리스 된 VS2015에서 수정해야합니다. –
- 1. std :: vector 또는 boost :: vector 스레드가 안전합니까?
- 2. Visual Studio 2012에서는 std :: atomic_flag 정적 초기화 스레드가 안전합니까?
- 3. WCF ClientBase 스레드가 안전합니까?
- 4. Socket.SendAsync 스레드가 효과적으로 안전합니까?
- 5. wx.StaticText 스레드가 안전합니까?
- 6. (Azure) DataCache.Increment 스레드가 안전합니까?
- 7. BroadcastReceiver onReceive() 스레드가 안전합니까?
- 8. work_queue 스레드가 안전합니까?
- 9. ScenarioContext.Current 스레드가 안전합니까?
- 10. ucLibc malloc 스레드가 안전합니까?
- 11. 안드로이드 컨텍스트 스레드가 안전합니까?
- 12. .net DbProviderFactory 스레드가 안전합니까?
- 13. 요청간에 HttpContext.Current.Items 스레드가 안전합니까?
- 14. System.Runtime.Serialization.DataContractSerializer 스레드가 안전합니까?
- 15. 정적 메서드 스레드가 안전합니까?
- 16. glib 스레드가 안전합니까?
- 17. 로깅 모듈 스레드가 안전합니까?
- 18. SqlConnection/SqlCommand 스레드가 안전합니까?
- 19. console.writeline 스레드가 안전합니까?
- 20. Three20Network 스레드가 안전합니까?
- 21. Mongoid에서 find_or_create_by 스레드가 안전합니까?
- 22. 확장 메서드 스레드가 안전합니까?
- 23. 정적 클래스 스레드가 안전합니까?
- 24. NotifyPropertyChanged 스레드가 안전합니까?
- 25. WCF의 DataContractSerilaizer 스레드가 안전합니까?
- 26. LIBSVM 스레드가 안전합니까?
- 27. WNetGetResourceInformation 스레드가 안전합니까?
- 28. 델파이 - TDictionary 스레드가 안전합니까?
- 29. String.intern() 스레드가 안전합니까?
- 30. 파일 인스턴스 스레드가 안전합니까?
'std :: regex' 인스턴스는 컴파일 된 정규 표현식을 나타내며 regex 컴파일은 값 비싼 프로세스이므로 재사용 할 수 있습니다. 물론 다른 스레드가 이미 그것을 사용하고있는 동안 기존 인스턴스 (std :: regex 또는 다른 것)를 교체/재 할당하는 것은 어리석은 일입니다. – rustyx