如何在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);
}
}
答
如上的评论中指出,迈克尔·萨斯确实存在一份关于添加此功能为OpenMP。他是几位建议在OpenMP中添加某种等待功能的人中的最后一位。 OpenMP语言委员会已多次提出这个问题。每次它被拒绝是因为还有其他方法可以执行此功能。我不知道Qt,但只要它提供的函数是线程安全的,那么你应该可以使用它们。
http://www.openmp.org/pipermail/omp/2007/000647.html – Anycorn 2011-03-17 08:58:21
@aaa然后,我假设使用QMutex&QWaitCondition为我的情况是一个不错的选择。 – vahapt 2011-03-17 09:03:06