4

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

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

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

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

状态:R(运行) Tgid:1623 Pid:1623 PPid:31002 TracerPid:0 Uid:500 500 500 500 Gid:100 100 100 100 Utrace:0 FDSize:256 组:100 VmPeak:346528 kB VmSize:345956 kB 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 自愿性_ctxt_switches:3460 非自愿性_ctxt_switches:24907

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

4

3 回答 3

4

如果您不关心产生线程并且只希望程序按顺序运行,则可以在 linux 上使用 numactl。

取自 SuperUser 上的这个答案,您可以通过使用限制程序一次执行一个线程

numactl --physcpubind=+1 /path/to/your/executable

numactl文档:

--physcpubind=cpus, -C cpus

仅在cpus上执行进程。它接受 /proc/cpuinfo 的处理器字段中显示的 cpu 编号,或相对于当前 cpuset 的相对 cpu。

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

于 2019-03-06T20:35:28.970 回答
1

不知道你想做什么,只有一个答案:你不能。

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

这是一般的想法。不管线程是否真的需要,如果一个库被设计成多线程的,你不能简单地把它变成单线程的。但是,您可以使用taskset,如您所提到的,或sched_setaffinity()(来自 C/C++)在单个 CORE 上运行进程。

于 2016-01-20T10:21:41.593 回答
0

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

于 2016-01-21T06:29:47.057 回答