我目前正在从事一个使用 OOP 设计机场的项目。我正在使用 C++。我的程序中有一个主要的 Airport 对象,它具有 RequestLanding() 函数,该函数分配飞机可以降落的跑道号。此函数返回两个枚举之一 - Hold 或 Proceed 以指示飞机是否应该着陆。
从外面看,有很多飞机物体发出着陆请求。我正在使用 for 循环来计算飞机对象的总数。我正在使用 OpenMp 进行并行循环。我想在 RequestLanding() 函数返回状态 Hold 时让 openmp 线程休眠 3 秒,然后重试。
有办法吗?有人可以提供一个简单的例子。提前致谢。
最佳答案
听起来你正在尝试做一些非常糟糕的事情。
你不应该在一个线程中手动轮询(反复检查条件) - 无论是否休眠 - 除非你真的知道你在做什么。而是使用像条件变量这样的适当构造来表示准备就绪。具体的正确方法取决于具体的用例。
在 OpenMP 中,线程是处理多项事情的 worker ,例如循环迭代。你不能不必要地延迟它,因为你会延迟它应该处理的其他事情(循环迭代,飞机)。
在 OpenMP 中,任务会稍微更适合处理飞机对象。然而,虽然任务可以有依赖关系,但它们只存在于兄弟任务或循环迭代之间,所以这对你没有帮助。您也可以在 OpenMP 任务中 taskyield
,但我在做出任何假设时都会非常小心。
作为一个例子,事情会如何并且将会变得非常错误:假设你有一个线程用于每架飞机并调用 std::this_thread::yield
因此 sched_yield
在一个紧密的循环检查条件。您可能认为被阻止的飞机会让其他飞机使用 CPU。你会错的。当前的 Linux 调度程序仍然会为被阻塞的飞机提供与想要进行实际工作的飞机相同的 CPU 时间。我希望 omp taskyield
以更好的方式实现,但我不会指望它。
同时,以任何形式调用sleep
都会引入人为延迟。
关于c++ - Openmp线程休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46757909/