나는 QuantLib의 thread-safety 속성을 명시 적으로 설명하는 문서를 찾을 수 없었습니다. QuantLib configuration documentation에는 스레드 안전과 관련된 많은 컴파일 타임 옵션이 나열되어 있습니다. 기본적으로 QuantLib은 완전히 스레드 안전하지는 않습니다. 특히여러 스레드에서 QuantLib을 사용하는 올바른 방법은 무엇입니까?
,이 있습니다 :
QL_ENABLE_SESSIONS는 - "정의 된 경우, 싱글은 다른 세션에 대해 서로 다른 인스턴스들을 반환 할 것이다 당신은 라이브러리와 네임 스페이스 QuantLib에서 sessionId가() 함수를 제공하고 링크해야합니다. 각 세션마다 다른 세션 ID를 반환합니다. 기본적으로 정의되지 않습니다. "
QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - "정의 된 경우 관찰자 패턴의 스레드 안전성이 있지만 성능이 떨어지는 버전이 사용됩니다 .JVM 또는 .NET 환경에서 SWIG 레이어를 통해 QuantLib을 사용하려면이 패턴을 정의해야합니다 시스템 또는 비동기 가비지 컬렉터가있는 모든 환경. 기본적으로 정의되지 않음. "
QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - "싱글 톤 초기화를 스레드로부터 안전하게 만들려면이 값을 정의하십시오. 기본적으로 정의되지 않았으며 여러 세션과 호환되지 않습니다."
어떤 옵션을 사용해야합니까, 나는 QuantLib 사용하려는 경우 다른 어떤 단계를 내가해야 : 여러 스레드에서
을하지만 결코 같은 시간에 (예를 들어 만 유지하는 경우, 글로벌 잠금)?
여러 스레드에서 동시에 있지만 개체를 공유하지 않는 경우?
여러 스레드에서 동시에 개체를 공유합니까?
내 응용을위한 자연 구조는 일단 입력 시장 데이터의 일정한 스트림을 가진 방향성 비순환 그래프는 다양한 개체를 계산하고 갱신하는데 사용하고, 상기 이탈 추정 가격의 흐름을 생성되고 다른 끝. 몇 가지 계산이 오랜 시간이 걸리므로 병렬로 여러 코어를 사용할 수 있어야합니다.
응용 프로그램은 대부분 Java로 작성되며 C++의 일부분만으로 작성되어 QuantLib와 인터페이스합니다. SWIG 래퍼를 사용할 계획이 아닙니다. 자바 가비지 컬렉터의 도움없이 QuantLib 객체의 메모리 관리를 해줘서 기쁩니다.
EDIT! UNIX에서 다음 옵션 중 하나를 설정하기로 결정하면, ./configure 아마에 해당 플래그와 함께 할 :
--enable-sessions
--enable-thread-safe-observer-pattern
--enable-thread-safe-singleton-init
"당신이 가진 선택이 당신을 도울 것입니다"라고 말할 때, 그들이 생각하는대로하지 않거나, 또는 작동하지 않거나, 또는 어떤 이유로 든 충분하지 않다는 것을 의미합니까? 또는 무엇을? –
@TomAnderson 그들은 당신이하고 싶은 일을하지 않을 것입니다. QuantLib 메일 링리스트를 검색하십시오. thread safe에 관한 게시물이 있습니다. 원하는 코드에 따라 일부 코드 함수는 전역 변수를 사용하지 않기 때문에 스레드로부터 안전합니다. – SmallChess
@TomAnderson 예를 들어 블랙 스콜 (Black Scholes)을 계산하기 만하면됩니다. BlackScholesCalculator에는 전역 종속성이 없으므로 스레드로부터 안전합니다. – SmallChess