如何在OpenMP上等待互斥锁

问题描述:

我有一个for循环将并行启动进程,每个启动的进程将返回一个表明它已准备好的响应。我想等待响应,如果达到某个超时,我会中止。如何在OpenMP上等待互斥锁

开发环境是VS2008
下面是伪代码:

void executeCommands(std::vector<Command*> commands) 
{ 
    #pragma omp parallel for 
    for (int i = 0; i < commands.size(); i++) 
    { 
     Command* cmd = commands[i]; 
     DWORD pid = ProcessLauncher::launchProcess(cmd->getWorkingDirectory(), cmd->getCommandToExcecute(), cmd->params); 

     //Should I wait for process to become ready? 
     if (cmd->getWaitStatusTimeout() > 0) 
     { 
      ProcessStatusManager::getInstance().addListener(*this); 

      //TODO: emit process launching signal 

      //BEGINNING OF QUESTION 
      //I don't how to do this part. 
      //I might use QT's QWaitCondition but if there is another solution in omp 
      //I'd like to use it 
      bool timedOut; 
      SOMEHANDLE handle = Openmp::waitWithTimeout(cmd->getWaitStatusTimeout(), &timedOut); 
      mWaitConditions[pid]) = handle; 
      //END OF QUESTION 

      if (timedOut) 
      { 
       ProcessStatusManager::getInstance().removeListener(*this); 
       //TODO: kill process 
       //TODO: emit fail signal 
      } 
      else 
      { 
       //TODO: emit process ready signal 
      } 
     } 
     else 
     { 
      //TODO: emit process ready signal 
     } 
    } 
} 

void onProcessReady(DWORD sourceProcessPid) 
{ 
    ProcessStatusManager::getInstance().removeListener(*this); 
    SOMEHANDLE handle = mWaitConditions[sourceProcessPid]; 
    if (mWaitConditions[sourceProcessPid] != 0) 
    { 
     Openmp::wakeAll(handle); 
    } 
} 
+0

http://www.openmp.org/pipermail/omp/2007/000647.html – Anycorn 2011-03-17 08:58:21

+0

@aaa然后,我假设使用QMutex&QWaitCondition为我的情况是一个不错的选择。 – vahapt 2011-03-17 09:03:06

如上的评论中指出,迈克尔·萨斯确实存在一份关于添加此功能为OpenMP。他是几位建议在OpenMP中添加某种等待功能的人中的最后一位。 OpenMP语言委员会已多次提出这个问题。每次它被拒绝是因为还有其他方法可以执行此功能。我不知道Qt,但只要它提供的函数是线程安全的,那么你应该可以使用它们。