【问题标题】:Openmp thread sleepOpenmp线程睡眠
【发布时间】:2017-10-16 03:31:43
【问题描述】:

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

从外面有许多飞机物体发出着陆请求。我正在使用 for 循环来计算飞机对象的总数。我正在使用 OpenMp 进行并行循环。我想在 RequestLanding() 函数返回状态 Hold 时让 openmp 线程休眠 3 秒,然后重试。

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

【问题讨论】:

  • 为什么不使用yield而不是睡觉?
  • @user0042 假设您的意思是std::this_thread::yield - 我强烈建议不要这样做。在 Linux 上,它映射到 sched_yield,而 sched_yield 的实现方式绝对不适合在紧密循环中调用。另见stackoverflow.com/q/6807929/620382

标签: c++ openmp


【解决方案1】:

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

您不应该在线程中手动轮询(反复检查条件)——无论是否睡眠——除非你真的知道自己在做什么。而是使用适当的构造(如条件变量)来表示准备就绪。具体正确的做法取决于具体的用例。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2014-07-29
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多