Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 同时运行两个make安全吗?_Makefile_Gnu Make - Fatal编程技术网

Makefile 同时运行两个make安全吗?

Makefile 同时运行两个make安全吗?,makefile,gnu-make,Makefile,Gnu Make,假设我在同一个目录中打开两个shell,并同时在这两个目录中运行make。当然没有很好的理由这么做,但这样做安全吗?它会导致生成文件损坏吗 对于一个更现实的例子,我可能在不同的目录中运行两个单独的make,而不知道它们都在同一目录中执行递归make。我怀疑这里的答案是,这太复杂了,无法确定,部分取决于所讨论的make文件的功能。一般的make操作方法应该使其更安全(如果某个文件比其源文件更新,则不会重建),但make文件缓存和操作顺序(特别是结合可能使用的-j)使我觉得这可能会起作用,但也可能会

假设我在同一个目录中打开两个shell,并同时在这两个目录中运行make。当然没有很好的理由这么做,但这样做安全吗?它会导致生成文件损坏吗


对于一个更现实的例子,我可能在不同的目录中运行两个单独的make,而不知道它们都在同一目录中执行递归make。

我怀疑这里的答案是,这太复杂了,无法确定,部分取决于所讨论的make文件的功能。一般的make操作方法应该使其更安全(如果某个文件比其源文件更新,则不会重建),但make文件缓存和操作顺序(特别是结合可能使用的
-j
)使我觉得这可能会起作用,但也可能会产生不良影响

也就是说,如果您的makefile是以“可证明”的正确方式构造的(这可能意味着不使用递归make),那么它可能就可以正常工作了


正如MadScientist在其评论中正确指出的,这里真正的根本问题是make运行的命令何时发生碰撞或重叠。在这种情况下,make本身正是导致这种情况发生的原因,因为它的内部测试会因为各种原因而相互竞争。

(如果某个东西比它的源更新,它就不会被重建)只有当concurent Makefile在另一个生成之后开始怀疑它时,您的语句才是正确的。这就像说让两个线程访问同一个对象是安全的,因为第一个线程在第二个线程到来时可能已经完成了。我错了吗?这完全取决于什么时候检查时间戳。这可能是在启动时(如果存在于文件缓存中),也可能是在需要依赖关系的规则出现之前。递归make使这一点变得非常复杂,因为现在需要处理多个make调用的计时。正如我所说,我认为答案是,总体而言,这不会很好地发挥作用,但在适当的情况下,它可能会发挥作用。tl;不要这样做。我喜欢并同意这个tl;博士,这不是真正的制造问题,使用
-j
并不比不使用更令人担忧(IMO)。任何进行调用的命令都可能有问题。考虑一个需要10秒的处方。你在同一时间开始两次制造。他们都做了修改时间检查,发现目标需要更新,同时开始他们的食谱。现在这两个命令同时运行,写入同一个输出文件:几乎肯定会损坏。这是非常正确的,我将对其进行编辑以明确说明。我关于
-j
的观点很可能(也可能仅限于)与递归make场景相关,因为它通过增加工作过程来增加问题。(
-j
本身会对编写糟糕的makefile造成严重破坏。)如果时机“正确”(错误),肯定会导致损坏。