Openmp线程睡眠

问题描述:

我目前正在开发一个项目,用OOP设计机场。我正在使用C++。我在我的程序中有一个主要的机场对象,它具有RequestLanding()函数,它分配飞机可以着陆的跑道编号。此函数返回两个枚举之一 - 保持或继续以指示飞机是否应着陆。Openmp线程睡眠

从外面有许多飞机对象,使得登陆请求。我正在使用for循环获取飞机对象的总数。我正在使用OpenMp进行并行循环。当RequestLanding()函数返回Hold状态然后再试时,我想让openmp sleep线程持续3秒。

有没有办法做到这一点?有人可以提供一个简单的例子。提前致谢。

+0

为什么不使用'yield' rahter比睡觉? – user0042

+0

@ user0042假设你的意思是'std :: this_thread :: yield' - 我强烈建议不要这样做。在Linux上,它映射到'sched_yield','sched_yield'的实现方式绝对不适合在紧密循环中调用。另请参阅https://stackoverflow.com/q/6807929/620382 – Zulan

这听起来像你正在尝试做的事情会非常糟糕。

除非您真的知道自己在做什么,否则您不应该在线程中手动轮询(重复检查条件) - 无论有无睡眠 - 都可以。而应使用像条件变量这样的适当结构来表示准备就绪。具体的正确方法取决于具体的用例。

在OpenMP中,线程是处理多种事情的工作者,例如循环迭代。你不能不必要地拖延它,因为你会延迟它应该处理的其他事情(循环迭代,飞机)。

在OpenMP中,任务稍微适合处理飞机对象。然而,虽然任务可以有依赖关系,但它们只是在兄弟任务或循环迭代之间,所以对你没有帮助。您也可以在OpenMP任务中使用taskyield,但我会在做出任何假设时非常小心。

作为一个例子,如何能的事情,并会去可怕的错误:假设你有一个线程每架飞机,并在紧密循环检查条件调用std::this_thread::yield因此sched_yield。您可能会认为被阻挡的飞机会让其他飞机使用CPU。你会错的。目前的Linux调度程序仍然会给被阻塞的飞机带来与那些想要做实际工作的人相同数量的CPU时间。我希望omp taskyield以更好的方式实施,但我不会指望它。

与此同时,以任何形式调用sleep都会引入仿真延迟。