1

我有一个 C# 项目,我需要确定给定日期是否是给定国家/地区的假期。为此,我可以使用QuantLib中的日期和日历功能。QuantLib 是用 C++ 编写的,因此我编写了一个包装器来调用此代码。我想知道我使用的代码是否是线程安全的。

以下是我在 C++ 中使用的 QuantLib 调用,用于确定给定日期是否为假日:

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,它是 QuantLib 的 .Net 端口。我更喜欢使用 QuantLib,因为它似乎有更好的支持。

4

2 回答 2

2

QuantLib 中有很多东西不是线程安全的(这表明肖恩的回答是正确的:总是检查!)但是这个特定的东西是安全的,除了一件事:UnitedStates实例的第一个构造将初始化一个构造函数中的静态变量,因此您可能需要处理这种情况。一旦构建了第一个实例,就可以安全地在并行线程中构建其他实例。

实例的构造Date和调用isHoliday都是安全的。

于 2013-12-20T14:26:10.340 回答
1

这完全取决于 C++ 库的实现。

如果您正在使用 C# 程序集,这没有什么不同。当你在一个对象上调用一个方法时,你怎么知道它是否是线程安全的?答案是你没有,你必须检查库文档。

如果您不确定,那么您始终可以在自己的代码中添加线程安全包装器,以便序列化对 API 的调用。

于 2013-12-20T14:00:07.477 回答