我在linux上使用专有的C ++库,通过gcc编译,使用pthreads(我必须在gcc上使用-lpthreads标志)。我有一个包装器,我知道该库正在使用多个线程。
库动态地使用多个线程 - 当我调用它时,我可以看到20个1线程之间的任何地方。但我不想使用任务集。 (我有其他进程正在运行,我希望系统管理核心。)
有没有办法强制我的可执行文件使用单线程? 在编译或运行时。感谢。
编辑: 我可以用taskset运行可执行文件,然后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 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 主题: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
所以,显然,它可以运行单线程。
答案 0 :(得分:2)
如果您不关心生成线程,只希望程序按顺序运行,则可以在Linux上使用numactl。
源自SuperUser上的this answer,您可以使用
将程序限制为一次只能执行一个线程numactl --physcpubind=+1 /path/to/your/executable
摘自numactl文档:
-physcpubind = cpus,-C cpus
仅对 cpus 执行进程。它接受/ proc / cpuinfo的处理器字段中显示的cpu编号,或相对于当前cpuset的相对cpus。
该程序仍将产生线程,但仅限于在单个CPU上执行。这意味着一次只能运行一个线程。
答案 1 :(得分:1)
在不知道你想要做什么的情况下,只有一个答案:你做不到。
你如何限制不使用多线程的东西?禁用pthread_create()
只会削弱程序。想象一下,lib会生成一个线程来对文件进行异步处理。如果您禁止pthread_create()
,文件操作会发生什么? lib现在无法正常工作,因为它无法执行文件操作。您需要完全重新设计lib;只是粉碎同一个线程上的文件IO(如果它甚至可能)可能是灾难性的,因为这个线程应该是自由运行的,现在被一些重IO阻止。
这是一般的想法。无论线程是否真的需要,如果lib被设计为多线程,你不能简单地使它成为单线程。但是,如您所述,您可以使用taskset
或sched_setaffinity()
(来自C / C ++)在单个CORE上运行进程。
答案 2 :(得分:0)
对这个过程的内部结构不太了解。但是,为什么不增强代码库来限制创建多个线程。当计数达到1以上时,您可以维护线程数并停止在进程中创建线程。