2013-12-20 1 views
1

У меня есть проект C#, в котором мне нужно определить, является ли данная дата праздником в данной стране. Для этой цели я могу использовать функцию даты и календаря в QuantLib. QuantLib написан на C++, поэтому я написал оболочку для вызова этого кода. Я хотел бы знать, является ли код, который я использую, потокобезопасным.Когда я вызываю код C++ из кода на C#, это поточно-безопасный?

Вот QuantLib вызовы Я использую в C++, чтобы определить, является ли данная дата праздник:

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++ код:

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

Больше всего я могу найти о коде QuantLib: here. Ничто в нем не выглядит небезопасным, но я не могу быть уверенным. В более общем плане, независимо от моего использования QuantLib, вызывается код C++, подобный этому потокобезопасным? Возможно ли, что один поток при создании объекта даты прерывается другим потоком, который каким-то образом искажает первый объект даты? Я знаю, что я могу заблокировать все вызовы статической функции C# isHoliday(), если этот код действительно небезопасен.

Обратите внимание, что мой код работает нормально, как есть.


Я знаю о QLNet, который является портом .Net из QuantLib. Я предпочитаю использовать QuantLib, потому что он, похоже, имеет лучшую поддержку.

+0

Вы всегда можете добавлять вызовы мьютекса в свой C++-обертку, например. 'std :: lock_guard ' in [C++ 11] (http://en.wikipedia.org/wiki/C++11) –

+0

Имеет ли QuantLib какие-либо известные проблемы с потоками? Если нет, вы можете просто следовать рекомендациям C++ и просто хранить все экземпляры только на основе каждого вызова. – Mgetz

ответ

2

В QuantLib есть много вещей, которые не являются потокобезопасными (это показывает, что ответ Шона верен: всегда проверяйте!), Но этот конкретный безопасен, за исключением одного: самой первой конструкции UnitedStates экземпляр инициализирует статическую переменную в конструкторе, поэтому вы можете захотеть позаботиться об этом случае. После создания первого экземпляра безопасно создавать другие в параллельных потоках.

Строительство объекта Date и звонок в isHoliday являются безопасными.

+0

Я собирался спросить, как вы это знаете, но потом я увидел ваше имя пользователя. Похоже, что все, что мне нужно сделать, это сделать вызов моего кода на C++ один раз при запуске поточно-безопасным способом. Спасибо Луиджи! – user2023861

1

Все зависит от реализации библиотеки C++.

Это не то же самое, если вы потребляете сборку C#. Когда вы вызываете метод на объекте, как вы знаете, если он потокобезопасен? Ответ в том, что вы этого не делаете, вам нужно проверить библиотечную документацию.

Если вы не уверены, вы всегда можете добавить потокобезопасную оболочку в свой собственный код, чтобы сериализовать вызовы API.

Смежные вопросы