【发布时间】:2017-10-25 13:50:55
【问题描述】:
我无法找到任何明确描述 QuantLib 的线程安全属性(或没有它们!)的文档。 QuantLib configuration documentation 列出了一些与线程安全相关的编译时选项,据我推断,默认情况下,QuantLib 并不完全是线程安全的。
具体有:
QL_ENABLE_SESSIONS - “如果已定义,单例将为不同的会话返回不同的实例。您必须在命名空间 QuantLib 中提供并与库链接一个 sessionId() 函数,为每个会话返回不同的会话 ID。未定义默认情况下。”
QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - “如果定义,将使用观察者模式的线程安全(但性能较低)版本。如果您想通过 JVM 或 .NET 中的 SWIG 层使用 QuantLib,则应该定义它生态系统或任何具有异步垃圾收集器的环境。默认情况下未定义。"
QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - “定义此项以使单例初始化线程安全。默认情况下未定义。与多个会话不兼容。”
如果我想使用 QuantLib,我应该使用哪些选项,以及我应该采取哪些其他步骤:
来自多个线程,但从不同时(例如仅在持有全局锁时)?
同时来自多个线程,但它们之间不共享任何对象?
同时来自多个线程,在它们之间共享对象?
我的应用程序的自然结构是有向无环图,在一端输入恒定的市场数据流,用于计算和更新各种对象,并在另一端产生估计价格流。我非常希望能够让多个内核并行工作,因为某些计算需要很长时间。
该应用程序将主要用 Java 编写,用 C++ 编写最少的部分以与 QuantLib 交互。我不打算使用 SWIG 包装器。我很高兴在没有 Java 垃圾收集器帮助的情况下对 QuantLib 对象进行内存管理。
编辑!如果您决定设置这些选项中的任何一个,那么在 unix 上,使用 ./configure 的相应标志进行设置:
--enable-sessions
--enable-thread-safe-observer-pattern
--enable-thread-safe-singleton-init
【问题讨论】:
标签: c++ multithreading concurrency thread-safety quantlib