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"