首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU make中的互斥作业调度?

GNU make中的互斥作业调度?
EN

Stack Overflow用户
提问于 2009-02-23 17:28:01
回答 2查看 1.3K关注 0票数 5

使用GNU make,是否可以在使用“--job”选项时创建一组永远不会同时调度的目标?

背景:

为了使其更具体,请考虑表单的makefile

代码语言:javascript
复制
p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

e1: ...deps... # cannot run at same time as any other e*
        ...rules...

e2: ...deps... # cannot run at same time as any other e*
        ...rules...

e3: ...deps... # cannot run at same time as any other e*
        ...rules...

我需要做的主要事情是确保e1、e2和e3永远不会被同时处理,因为它们在资源有限的嵌入式设备上执行一些工作。如果它们中的多个同时执行,它们就会崩溃。p2和p3可以与任何东西并行执行,包括任何e*作业。

请注意,实际的makefile有几千个目标,它们的依赖关系树大约有10层深,所以我希望有一种方法可以做到这一点:(a)不需要串行运行make,(b)保留在makefile中编码依赖关系树的好处。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-23 17:38:55

您的一个选择是使用"flock“在独占锁下运行"e”规则。详情见man flock(1)。例如,而不是

代码语言:javascript
复制
e2: deps
    my_cmd foo bar

你可以拥有

代码语言:javascript
复制
e2: deps
    flock .embedded-device-lock -c my_cmd foo bar

然后发生的是,所有的"e“目标都由make并行启动(可能),但实际的命令将串行执行。

票数 6
EN

Stack Overflow用户

发布于 2009-02-23 17:48:38

这不是一个完美的解决方案,但您可以使用一个仅限订单的前提条件来对e*目标进行特定的排序:

代码语言:javascript
复制
e1: ...deps...
    ...commands...
e2: ...deps... | e1
    ...commands...
e3: ...deps... | e2 e1
    ...commands...

管道符号'|‘后面的前提条件是仅限顺序的:它们不会强制(比方说)在e1或e2发生更改时更新e3,但它们确实要求e1和e2的所有命令在启动e3的命令之前完成运行。

这样做的缺点是,它为这些互斥的先决条件强加了特定的顺序,而不是让make选择顺序,但在实践中,您可能可以手动确定一个合理的顺序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/578521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档