我可以强制 C++ 库使用单线程吗?

Can I force C++ library to use single thread?

我在 linux 上使用专有的 C++ 库,通过 gcc 编译,它使用 pthreads(我必须在 gcc 上使用 -lpthreads 标志)。我有一个包装器,我知道该库正在使用多个线程。

该库动态使用多个线程 - 当我调用它时,我可以看到 20 到 1 个线程之间的任何位置。 但我不想使用任务集。 (我有其他进程 运行ning 并且我希望系统管理核心)。

有没有办法强制我的可执行文件使用单线程? 在编译时或在 运行 时。谢谢

编辑: 我可以 运行 带有任务集的可执行文件,然后 cat /proc//status 给我:

State: R (running) Tgid: 1623 Pid: 1623 PPid: 31002 TracerPid: 0 Uid: 500 500 500 500 Gid: 100 100 100 100 Utrace: 0 FDSize: 256 Groups: 100 VmPeak: 346528 kB VmSize: 345956 kB VmLck: 0 kB VmHWM: 199816 kB VmRSS: 188388 kB VmData: 192120 kB VmStk: 128 kB VmExe: 656 kB VmLib: 12444 kB VmPTE: 432 kB VmSwap: 0 kB Threads: 1 SigQ: 2/62004 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000004 SigCgt: 0000000180000000 CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: 02 Cpus_allowed_list: 1 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 3460 nonvoluntary_ctxt_switches: 24907

所以,显然,它可以 运行 单线程。

在不知道自己想要做什么的情况下,只有一个答案:你不能。

你会如何限制某些东西不使用多线程?禁用 pthread_create() 只会削弱程序。想象一下,lib 生成一个线程来对文件执行一些异步工作。如果您禁止 pthread_create(),文件操作会怎样?该库现在无法正常工作,因为它无法执行其文件操作。您需要对库进行彻底的重新设计;仅仅在同一个线程上破坏文件 IO(如果可能的话)可能是灾难性的,因为这个线程应该是空闲的 运行ning,现在被一些繁重的 IO 阻塞了。

这是一般的想法。不管线程是否真的需要,如果一个lib被设计成multi-thread,你不能简单地让它single-thread。但是,您可以使用 taskset,正如您提到的,或 sched_setaffinity()(从 C/C++)到 运行 单个 CORE 上的进程。

不太了解进程的内部结构。但是为什么不增强代码库以限制创建超过 1 个线程。您可以维护线程的计数,并在计数超过 1 时停止在进程中创建线程。

如果您不关心生成线程,只想让程序按顺序运行,您可以在 linux.

上使用 numactl

取自 SuperUser 上的 this answer,您可以使用

限制程序一次 执行一个线程
numactl --physcpubind=+1 /path/to/your/executable

来自 numactl 文档:

--physcpubind=cpus, -C cpus

Only execute process on cpus. This accepts cpu numbers as shown in the processor fields of /proc/cpuinfo, or relative cpus as in relative to the current cpuset.

该程序仍会生成线程,但仅限于在单个 CPU 上执行。这意味着一次只能有一个线程 运行。