2013-12-20 1 views
1

나는 지정된 날짜가 주어진 국가의 휴일인지를 결정할 필요가있는 C# 프로젝트를 가지고있다. 이 목적으로 QuantLib에 날짜 및 캘린더 기능을 사용할 수 있습니다. QuantLib은 C++로 작성되었으므로이 코드를 호출하는 래퍼를 작성했습니다. 사용중인 코드가 스레드로부터 안전한지 알고 싶습니다.C# 코드에서 C++ 코드를 호출하면 스레드로부터 안전합니까?

[DllImport("QuantLibHelpers.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int isHoliday(int year, int month, int day, 
    int trueValue, int falseValue, int errorValue); 
:

extern "C" _declspec(dllexport) int isHoliday(int year, int month, int day, 
    int trueValue, int falseValue, int errorValue) 
{ 
    try 
    { 
     QuantLib::Calendar cal = QuantLib::UnitedStates(); 
     QuantLib::Date date(day, (QuantLib::Month)month, year); 

     return cal.isHoliday(date) ? trueValue : falseValue; 
    } 
    catch(...) 
    { 
     return errorValue; 
    } 
} 
여기

내가 ++ 코드 내 C 전화를 사용하는 C#을 서명입니다 : 여기

는 QuantLib 내가 주어진 날짜가 휴일인지 확인하기 위해 C++에서 사용하는 호출이다

내가 QuantLib 코드에 대해 가장 많이 찾은 것은 here입니다. 거기에 thread-unsafe는 보이지 않지만 확실하지는 않습니다. 더 일반적으로, 내 QuantLib의 사용에 관계없이이 스레드 안전 C와 같은 코드를 호출하고 있습니까? 한 스레드가 날짜 객체를 만드는 동안 다른 스레드에 의해 중단되어 어떤 방식 으로든 첫 번째 객체를 손상시킬 수 있습니까? 이 코드가 실제로는 thread-unsafe 인 경우 C# isHoliday() 정적 함수에 대한 모든 호출을 잠글 수 있다는 것을 알고 있습니다.

참고로 내 코드는 정상적으로 작동합니다.


제가 알고있는 QLNet은 QuantLib의 .Net 포트입니다. 나는 더 나은 지원을 가지고 있기 때문에 QuantLib을 사용하는 것을 선호합니다.

+0

C++ 래퍼에 mutex 호출을 항상 추가 할 수 있습니다 (예 : [C++ 11]의 'std :: lock_guard '(http://en.wikipedia.org/wiki/C++11) –

+0

QuantLib에 알려진 스레딩 문제가 있습니까? 그렇지 않다면 C++ 베스트 프랙티스를 따라갈 수 있으며 호출 당 기준으로 만 인스턴스를 유지하면됩니다. – Mgetz

답변

2

썬의 답이 옳다는 것을 보여주기 위해 쓰레드 안전하지 않은 것들이 많이 있습니다. (항상 확인하십시오!)하지만이 한가지는 한 가지를 제외하면 안전합니다 : UnitedStates 인스턴스는 생성자에서 정적 변수를 초기화하므로이 경우에주의해야합니다. 첫 번째 인스턴스가 빌드되면 병렬 스레드로 다른 인스턴스를 빌드하는 것이 안전합니다.

Date 인스턴스의 생성과 isHoliday에 대한 호출은 모두 안전합니다.

+0

나는 당신이 이것을 어떻게 알았는지에 관해 물어 보려고했지만 그때 나는 당신의 사용자 이름을 보았습니다. 그것은 내가 시작해야 할 때 한 번 쓰레드 안전 방식으로 내 C++ 코드를 호출해야한다는 것입니다. 감사합니다 루이지! – user2023861

1

모든 것은 C++ 라이브러리의 구현에 달려 있습니다.

C# 어셈블리를 사용하는 경우와 다르지 않습니다. 객체에 대한 메쏘드를 호출 할 때 그것이 쓰레드에 안전한지 어떻게 알 수 있습니까? 대답은 그렇지 않습니다. 라이브러리 설명서를 확인해야합니다.

확실하지 않은 경우 API 호출을 직렬화하기 위해 항상 코드에 스레드 안전 래퍼를 추가 할 수 있습니다.

관련 문제