Openmp线程睡眠

时间:2017-10-15 17:27:30

标签: c++ openmp

我目前正在开展一个用OOP设计机场的项目。我正在使用c ++。我的程序中有一个主要的Airport对象,它有RequestLanding()函数,用于分配飞机可以降落的跑道号。此函数返回两个枚举中的一个 - 保持或继续以指示平面是否应着陆。

从外面有许多飞机物体可以进行着陆请求。我用于循环飞机物体的总数。我正在使用OpenMp进行并行循环。当RequestLanding()函数返回状态Hold然后再试一次时,我想做一个openmp sleep的线程3秒钟。

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

1 个答案:

答案 0 :(得分:1)

听起来你正在尝试做一些非常糟糕的事情。

你不应该在线程中手动轮询(反复检查条件) - 有或没有睡觉 - 除非你真的知道你在做什么。而是使用适当的构造,如条件变量来表示准备就绪。具体的正确方法取决于具体的用例。

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

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

作为一个例子,事情如何能够并且将会出现可怕的错误:假设您为每架飞机设置了一个线程,并在紧急循环中调用std::this_thread::yield sched_yield来检查条件。你可能会认为被阻挡的飞机会让其他飞机使用CPU。你错了。当前的Linux调度程序仍然会为阻塞的飞机提供与想要实际工作的人相同的CPU时间。我希望omp taskyield以更好的方式实施,但我不会指望它。

同时,以任何形式调用sleep都会引入人为延迟。