Я довольно новичок в QuantLib и еще не знаю всех входов и выходов исходного кода, но я пытался протестировать простое многопоточное вычисление значений NPV нескольких опций и получаю ошибки времени выполнения. Вот мой тестовый код, который только что расширен из примера EquityOpiton, включенного в QL.
// 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, я заметил, и я не уверен, какие из них вызывают проблему.
Кажется, вы забыли добавить разрыв после каждого случая. Попробуйте следовать
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;
}
Других решений пока нет …