Когда я вызываю код C ++ из кода C #, это потокобезопасно?

У меня есть проект на 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, потому что он, кажется, имеет лучшую поддержку.

1

Решение

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

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

2

Другие решения

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

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

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

1

По вопросам рекламы [email protected]