2013-05-17 4 views
1

저는 QuantLib을 처음 접했지만 소스의 모든 기능을 아직 알지 못했습니다. 그러나 여러 옵션의 NPV를 계산하는 간단한 멀티 스레드를 테스트하고 런타임 오류가 발생했습니다. 다음은 QL에 포함 된 EquityOpiton 예제에서 확장 된 테스트 코드입니다.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 여러분을 환영합니다. 왼쪽에있는 위쪽 삼각형을 클릭하면 유용한 답변을 upvote 할 수 있습니다. (이것은 가장 유용한 답을 표시하는 것 외에 사용할 수 있습니다.) –