Multithreading 多线程制造
我可以使用Multithreading 多线程制造,multithreading,makefile,Multithreading,Makefile,我可以使用make-jN 我可以在Makefile中指定多线程,以便从命令行运行多个线程。这是我的makefile: BIN_OBJS = $(wildcard *.bin) HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS)) all: $(HEX_OBJS) $(HEX_OBJS): %.hex: %.bin python ../../tools/bin2h.py $< > $@ BIN_OBJS=$(通配符*.BIN) HEX_OBJ
make-jN
我可以在Makefile中指定多线程,以便从命令行运行多个线程。这是我的makefile:
BIN_OBJS = $(wildcard *.bin)
HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS))
all: $(HEX_OBJS)
$(HEX_OBJS): %.hex: %.bin
python ../../tools/bin2h.py $< > $@
BIN_OBJS=$(通配符*.BIN)
HEX_OBJS=$(subst.bin,.HEX,$(bin_OBJS))
全部:$(十六进制)
$(十六进制对象):%十六进制:%.bin
python.././tools/bin2h.py$<>$@
首先,要明确的是,make不是多线程的。使用-j
只需告诉make同时运行多个命令(基本上是在后台)
其次,不,不可能从makefile中启用多个作业。一般来说,您不想这样做,因为其他系统的内核数量不同,并且您选择的任何值都无法在这些系统上正常工作
不过,您不必编写多个makefiles,只需使用:
BIN_OBJS = $(wildcard *.bin)
HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS))
.PHONY: all multi
multi:
$(MAKE) -j8 all
all: $(HEX_OBJS)
$(HEX_OBJS): %.hex: %.bin
python ../../tools/bin2h.py $< > $@
BIN_OBJS=$(通配符*.BIN)
HEX_OBJS=$(subst.bin,.HEX,$(bin_OBJS))
.假的:都是多重的
多种:
$(MAKE)-j8全部
全部:$(十六进制)
$(十六进制对象):%十六进制:%.bin
python.././tools/bin2h.py$<>$@
如果make所在的文件系统是nfs共享,请小心使用-j。我看到了一些奇怪的结果,并向我提到nfs装载的目录的操作方式不同(某种文件锁定问题?)
我从一个脚本运行multi-make并检查cpuinfo以了解构建框有多少个处理器(在多个架构/构建机器上运行相同的脚本)
刚刚意识到我可以做
all:$(MAKE)-j8make2
或类似的事情,但希望有一个更好的选择,您可以使用.NOTPARALLEL:
作为伪目标来抑制并行操作。除了命令行选项(请参阅)之外,我还不知道强制并行的方法。设置MAX_PARALLEL=8
并使用-j${MAX_PARALLEL}
可能是明智的,这样您可以在需要时覆盖命令行上的并行性。@这非常合适。Thanksis不是同时运行多个命令,就像运行多个线程一样吗?不是。运行多个命令就是多处理。区别在于资源访问:每个进程都有自己的内存和其他资源,由内核分开保存,没有进程可以访问另一个进程的资源(除非通过显式共享,但这是一个复杂的主题)。多个线程都在同一个进程内运行,因此它们都可以访问相同的资源(只有少数位“线程本地存储”,仅限于每个线程)。在大多数操作系统上,您可以免费获得多处理功能。多线程要求您以特定的方式编写程序以支持它。
CPUCOUNT=$(grep -c "^processor" /proc/cpuinfo)
if [ ${CPUCOUNT} -lt 1 -o ${CPUCOUNT} -gt 4 ]
then
echo "Unexpected value for number of cpus, ${CPUCOUNT}, exiting ..."
exit 16
fi
echo "This machine has ${CPUCOUNT} cpus, will use make -j${CPUCOUNT} where possible"