QuantLib Multithreading/Concurrecy
QuantLib Multithreading/Concurrecy
我对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;
}