У меня есть проект на C #, в котором мне нужно определить, является ли данная дата выходным днем в данной стране. Я могу использовать функцию даты и календаря в QuantLib для этого. QuantLib написан на 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, это Вот. Там нет ничего опасного, но я не уверен. В более общем смысле, независимо от того, как я использую QuantLib, вызов кода C ++ подобен этому потокобезопасному? Возможно ли, что один поток при создании объекта даты прерывается другим потоком, который каким-то образом повреждает первый объект даты? Я знаю, что могу заблокировать все вызовы статической функции C # isHoliday (), если этот код действительно потокобезопасен.
Обратите внимание, что мой код работает нормально, как есть.
Я знаю о QLNet который является портом .Net QuantLib. Я предпочитаю использовать QuantLib, потому что он, кажется, имеет лучшую поддержку.
В QuantLib есть много вещей, которые не являются поточно-ориентированными (что показывает, что ответ Шона верен: всегда проверяйте!), Но этот конкретный является безопасным, за исключением одной вещи: самой первой конструкции UnitedStates
instance инициализирует статическую переменную в конструкторе, поэтому вы можете позаботиться об этом случае. После создания первого экземпляра безопасно создавать другие в параллельных потоках.
Строительство Date
экземпляр и призыв к isHoliday
оба безопасны.
Все зависит от реализации библиотеки C ++.
Это не отличается от того, если вы используете сборку C #. Когда вы вызываете метод объекта, как узнать, является ли он потокобезопасным? Ответ: нет, вы должны проверить документацию библиотеки.
Если вы не уверены, то вы всегда можете добавить потоковую оболочку в свой собственный код для сериализации вызовов API.