2013-05-17 2 views
1

Я довольно новичок в QuantLib и еще не знаю все входы и выходы источника, но я пытался проверить простой многопоточный расчет NPV с несколькими вариантами и получить ошибки времени выполнения. Вот мой тестовый код, который просто расширен из примера EquityOpiton, включенного в QL.QuantLib Многопоточность/Concurrecy

// 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, которые я заметил, и я не уверен, какие из них вызывают проблему.

ответ

1

Похоже, вы забываете добавить перерыв после каждого случая. Попробуйте следовать

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; 
} 
+0

derp. Вы поняли, что это трюк ... Большое спасибо за чтение и ответ. – user2183336

+0

@ user218336 Добро пожаловать. Вы можете найти ответы, которые вы найдете полезными, щелкнув вверх-треугольник слева от них. (Это доступно в дополнение к контрольной маркировке ответа, наиболее полезного для вас.) –

Смежные вопросы