QuantLib Multithreading/Concurrecy

QuantLib Multithreading/Concurrecy

本文关键字:Concurrecy Multithreading QuantLib      更新时间:2023-10-16

我对QuantLib相当陌生,还不知道源代码的所有细节,但我试图测试几个选项的npv的简单多线程计算,并得到运行时错误。以下是我的测试代码,它是从QL中包含的EquityOpiton示例扩展而来的。

// options
VanillaOption europeanOption(payoff, europeanExercise);
VanillaOption bermudanOption(payoff, bermudanExercise);
VanillaOption americanOption(payoff, americanExercise);
boost::thread_group worker_threads;
for( int x = 0; x < 3; ++x )
{
     switch (x)
     {
     case 0:
        europeanOption.setPricingEngine(boost::shared_ptr(
           new FDEuropeanEngine(bsmProcess,
                                                100,99)));
        worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &europeanOption ) );
     case 1:
        bermudanOption.setPricingEngine(boost::shared_ptr(
          new FDBermudanEngine(bsmProcess,
                                                100,99)));
        worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &bermudanOption ) );
     case 2:
       americanOption.setPricingEngine(boost::shared_ptr(
         new FDAmericanEngine(bsmProcess,
                                                100,99)));
        worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &americanOption ) );
      default:
        break;
  }
}

worker_threads.join_all();

究竟是什么导致了这些运行时错误,我该如何修复它?我猜它与共享指针有关,但它们在整个QL中被大量使用,我已经注意到,我不确定是哪一个(s)导致了这个问题。

似乎您忘记在每个case后面添加break。试后

 switch (x)
 {
 case 0:
 {
    europeanOption.setPricingEngine(boost::shared_ptr(
       new FDEuropeanEngine(bsmProcess, 100,99)));
    worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &europeanOption )  );
    break;
 }
 case 1:
 {
    opt = &bermudanOption;
    bermudanOption.setPricingEngine(boost::shared_ptr(
      new FDBermudanEngine(bsmProcess,
                                            100,99)));
    worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &bermudanOption ) );
    break;
 }
 case 2:
 {
   americanOption.setPricingEngine(boost::shared_ptr(
     new FDAmericanEngine(bsmProcess,
                                            100,99)));
    worker_threads.create_thread( boost::bind( &VanillaOption::NPV, &americanOption ) );
    break;
  }
  default:
    break;
 }