与野牛一起制作-j

时间:2014-03-09 19:35:44

标签: parallel-processing makefile bison

我遇到了一个奇怪的并行构建问题。我的makefile看起来像这样(不是实际的Makefile,只是为了说明这一点,所以不要讨厌):

parser.c parser.h : parser.y
lexer.c : lexer.l parser.h
app : lexer.o parser.o

因为parser.c和parser.h文件都依赖于parser.y,所以bison最终会被调用两次,一次代表lexer.c(包括parser.h,因此依赖于它),并且一旦打开代表app(取决于parser.o,它取决于parser.c。)。

当我使用-d查看调试输出时,我看到bison在两个不同的线程中被调用了两次,相对靠近。我担心当所有的星星对齐时,我可能会遇到竞争条件和腐败的野牛输出。我尝试了一些依赖项的东西,试图强制它们是串行的,但我只是开始让陌生人和陌生人做出行为。

所以,百万美元的问题是这样的:当一个像野牛这样的程序实际上输出两个文件,满足两个依赖关系时,是否有一个更理智的方式,因此当使用-j构建时可能会从两个不同的未同步调用线程?

感谢。

1 个答案:

答案 0 :(得分:0)

你应该使用模式规则;在模式规则中,多个目标意味着一次调用配方会生成两个目标:

%.c %.h : %.y
    ...