2010-01-09 2 views
1

Я добавил код OpenMp к некоторому серийному коду в приложении симулятора при запуске программы, использующей это приложение программа неожиданно выходит с выходом «Поток« Win32 Thread »(0x1828) вышел с кодом 1 (0x1)», это происходит в параллельной области, где я добавил код OpenMp, Вот пример кода:приложение выходит преждевременно с помощью OpenMp с кодом ошибки: Fatal User Error 1002: Не все конструкторы совместного использования, выполняемые всеми потоками

#pragma omp parallel for private (curr_proc_info, current_writer, method_h) shared (exceptionOccured) schedule(dynamic, 1) 
    for (i = 0 ; i < method_process_num ; i++) 
    { 
     current_writer = 0; 
     // we need to add protection before we can dequeue a method from the methods queue, 

     #pragma omp critical(dequeueMethod) 
     method_h = pop_runnable_method(curr_proc_info, current_writer); 

     if(method_h !=0 && exceptionOccured == false){ 
      try { 
      method_h->semantics(); 
      } 
      catch(const sc_report& ex) { 
       ::std::cout << "\n" << ex.what() << ::std::endl; 
       m_error = true; 
       exceptionOccured = true; // we cannot jump outside the loop, so instead of return we use a flag and return somewhere else 
      } 

     } 
    } 

Планирование было статическим до того, как я сделал его динамическим, после того как я добавил динамический размер блока 1, приложение проделало еще немного до его выхода, может ли это быть индикатором того, что происходит? n рядом с параллельной областью? спасибо

ответ

0

Как я его прочитал, и я больше программист Fortran, чем C/C++, ваша приватная переменная curr_proc_info не объявлена ​​(или определена?), Прежде чем она появится в вызове pop_runnable_method. Но частные переменные не определены при входе в параллельную область.

Я также думаю, что ваш общий доступ к exception_occurred немного подозрительный, поскольку он предполагает, что исключение в любом потоке должно быть замечено каким-либо потоком, а не только потоком, в котором он замечен. Конечно, это может быть вашим намерением.

Приветствия

Все

+0

Спасибо за Ваш ответ знаком, есть 2 способа сделать переменную частной в теме, тот, который вы предложили, и тот, который я использую, когда я определяю их как private в предложении pragma, и они объявляются прямо перед кодом, который я вложил, иначе я получил бы ошибку компиляции, и да, это мое намерение использовать флаг exceptionOccured. – Noona

+0

Да, вы определили curr_proc_info в своем предложении pragma, но вы не присвоили ему значение, прежде чем передавать его в функцию pop_runnable_method. Если для этой функции требуется значение curr_proc_info, у вас будут проблемы. Если эта функция присваивает значение curr_proc_info, у меня нет идей. –

+0

Я хочу назначить ему значения в функции, которую я вызываю (используя вызов по ссылке). Причина проблемы связана с планированием OpenMp или чем-то связанным с OpenMp, вот где я надеюсь получить совет. – Noona