有没有一种简单的方法可以在 Linux 上运行同一 C++ 程序的多个实例?

有没有一种简单的方法可以在 Linux 上运行同一 C++ 程序的多个实例?

我有一个 C++ 程序,我想在 Linux 机器上并行运行,每个实例都是一个完全独立的进程,不与其他进程通信。有没有一种简单的方法可以执行以下操作:

  1. 统计当前机器上的CPU核心数。
  2. 对于 CPU 核心数,运行程序的一个实例,将每个实例分配给一个核心。
  3. 定期检查实例是否仍在运行,并在必要时重新启动实例。

答案1

统计当前机器上的CPU核心数。

有多种特殊文件和命令提供此信息,并且还有一些方法可以做到这一点以编程方式。最后一个链接可能是最好的选择,因为它考虑了 CPU 关联性设置。

对于 CPU 核心数,运行程序的一个实例,将每个实例分配给一个核心。

这听起来像是一个循环forkexec

定期检查实例是否仍在运行,并在必要时重新启动实例。

您可以使用wait系统调用以查看是否有任何子进程已退出,如果是,则启动一个新实例。


上述解决方案允许您通过编写一些额外的 C/C++ 代码来满足您的要求。您可以在 shell 脚本中应用相同的原则。以下脚本sleep在每个核心运行一次非常有趣的命令,确保命令退出时启动新命令以保持运行命令的数量sleep不变:

#!/bin/bash

numprocs=$(nproc)
echo "There are $numprocs cores available"

while true; do
    sleep $(( RANDOM % 10 )) &
    (( running++ ))
    echo "running=$running"

    if (( running >= $numprocs )); then
        wait -n -p pid
        (( running-- ))
        echo "$pid stopped"
    fi
done

您可以执行类似的操作,将sleep命令替换为您尝试运行的任何命令。

答案2

yes 3 | parallel sleep

sleep 3这将无限期地运行与处理器数量相同的数量。

或者本着另一个答案但更简单的精神:

for ((i=$(nproc);i>0;i--)) ; do
  while true ; do
    sleep $(( 1+RANDOM%10 ))
  done &
done

相关内容