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

时间:2016-01-20 09:16:06

标签: c++ gcc pthreads single-threaded

我在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

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

3 个答案:

答案 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被设计为多线程,你不能简单地使它成为单线程。但是,如您所述,您可以使用tasksetsched_setaffinity()(来自C / C ++)在单个CORE上运行进程。

答案 2 :(得分:0)

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