【问题标题】:Best practices to avoid race conditions in a makefile?避免生成文件中的竞争条件的最佳实践?
【发布时间】:2013-06-13 21:04:38
【问题描述】:

当您编写一个应该并行运行的 makefile 时,您知道一些避免竞争条件的方法吗?有某种障碍吗?如何按顺序运行某个部分?或者,我怎样才能暂停其他处理器,直到创建一些关键对象?

谢谢!

【问题讨论】:

  • Make 应该自己解决这个问题除非你使用递归 make 在这种情况下你已经违反了保证。如果您还没有阅读它,请搜索“Recursive Make Considered Harmful”。
  • 请注意,make 本身(无论如何是 GNU make)是单线程的,因此(除非 dmckee 所说的递归错误)永远不会有竞争条件。它实现并行的方式是在后台同时运行多个命令。因此,只要您的命令在编写时不相互交互,您就不会遇到竞争条件问题。如果您有具体问题,请描述它。
  • 看起来您正在使用-j。检查stackoverflow.com/a/16831451/2235132 是否有帮助。

标签: build compilation makefile


【解决方案1】:

您需要考虑以下几点:

  1. 不要生成未指定为目标的文件。例如,如果您有 2 条规则恰好产生“fred.tmp”(甚至可能在之后删除它),并且它们同时运行,那么就会发生不好的事情
  2. 尽可能缩短构建规则。最好是一个命令。
  3. 不要进行递归构建。即使它们没有中断,-j 也会传递给每个子 make,从而导致 CPU 使用率呈指数增长。

标准 make 中没有办法表明 2 个规则不能并行运行。

您不妨考虑研究一些其他构建工具(例如SCons),看看它们是否能更好地解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2010-09-25
    • 2015-09-10
    • 2010-09-25
    • 2019-06-12
    相关资源
    最近更新 更多