有没有办法强制程序只使用1个线程?

时间:2016-07-28 13:12:25

标签: c++ linux multithreading

我正在对Linux上一个烦人的cpp程序进行基准测试。该计划是一个混乱和复杂的地狱!它会自动执行多线程,我想知道是否有任何方法可以通过某种方式调用它,即taskset等,只使用1个线程。

编辑:我尝试过设置" taskset 01 program arg1 ..."但它不起作用。我刚刚看到程序使用100个线程!

3 个答案:

答案 0 :(得分:3)

要限制 Linux 进程在一个核心上运行taskset。以下摘自https://serverfault.com/a/32331

taskset <affinity mask> -p <process>

taskset 1 -p 12345

将进程12345设置为仅使用处理器/核心1

位掩码可以是一个列表(即1,3,4使用4 +核系统的核1 3和4)或十六进制的位掩码(0x0000000D 1,3,4,0x00000001仅用于核1)

taskset通常位于名为shedutils的包中。

编辑:差点忘了...如果要设置新命令的亲和力而不是为现有流程更改它,请使用:

taskset <mask> <program> [<arg1>]...[<argN>]

答案 1 :(得分:2)

(我假设您接受Linux特定的解决方案)

在Linux上,使用NPTL系统调用创建线程(至少clone(2)个)。记录失败

  

EAGAIN已经有太多进程在运行;见fork(2)。

(事实上,内核正在调度可能是线程或[单线程]进程的任务)

您可以将setrlimit(2)RLIMIT_NPROC

一起使用
  

RLIMIT_NPROC最大进程数(或者更准确地说是在Linux上,                 线程)可以为真实用户ID创建                 呼叫过程。

所以我猜你可以使用它(可能在终端中运行的shell中内置ulimit bash)来限制成功创建的线程的数量(实际上是“任务”) )。

但我不确定这是个好主意。编写良好的程序将测试pthread_create(3)(内部调用clone(2))的失败。写得不好的程序会崩溃。

也许该程序正在使用某个线程池,并且有一些方法可以限制该池的大小。顺便说一下,你可以只在两个核心上运行几十个线程 - 甚至是一个核心 - (特别是在大多数情况下线程空闲时,例如poll(2) - 或等待I / O)。

PS。出于基准测试目的,您可能应该更多地关注限制核心数量(使用taskset)而不是限制线程数。

答案 2 :(得分:1)

如果程序试图产生线程,除了程序本身有一些限制线程的命令行选项之外,你无法做任何事情来阻止它。