多线程制作

use*_*084 9 multithreading makefile

我可以用多线程制作 make -jN

我可以 Makefile中指定多线程,以便make从命令行运行多个线程.这是我的makefile:

BIN_OBJS = $(wildcard *.bin)
HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS))

all: $(HEX_OBJS)

$(HEX_OBJS): %.hex: %.bin
    python ../../tools/bin2h.py $< > $@
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 17

首先,要明确,make不是多线程的.使用-jjust告诉make同时运行多个命令(基本上在后台).

其次,不,不可能在makefile中启用多个作业.一般而言,您不希望这样做,因为其他系统将具有不同数量的核心,并且您选择的任何值在这些系统上都无法正常工作.

但是,您不必编写多个makefile,只需使用:

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 $< > $@
Run Code Online (Sandbox Code Playgroud)

  • 不。运行多个命令是多重处理。区别在于资源访问:每个进程都有自己的内存和其他资源,由内核分开,并且没有进程可以访问另一个进程的资源(除非通过显式共享,但这是一个复杂的主题)。多个线程都在同一进程内运行,因此它们都可以访问相同的资源(只有几个位,“线程本地存储”,仅限于每个线程)。在大多数操作系统上,您可以免费获得多处理功能。多线程要求您以特定的方式编写程序来支持它。 (2认同)

小智 5

如果发生 make 的文件系统是 nfs 共享,请小心使用 -j。我看到了奇怪的结果,并且有人向我提到 nfs 安装目录的操作方式不同(某种文件锁定问题?)

我从一个脚本运行了我的多个版本,并检查了 cpuinfo 以找出构建框有多少个处理器(针对多个架构/构建机器运行相同的脚本)

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"
Run Code Online (Sandbox Code Playgroud)