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

mou*_*mer 4 c++ gcc pthreads single-threaded

我在 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:345 956 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:00 00000000000000 ShdPnd:0000000000000000 SigBlk:0000000000000000 SigIgn:0000000000000004 SigCgt:0000000180000000 CapInh:0000000000000000 CapPrm:0000000000000000 CapEff:0000000000000000 CapBnd:ffffffffffffffff CPU _allowed: 02 CPU_allowed_list: 1 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0 0000000, 00000000,00000000,00000000,00000001 Mems_allowed_list:0 voluntory_ctxt_switches:3460 nonvoluntory_ctxt_switches:24907

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

Inc*_*tic 5

如果您不关心生成线程而只希望程序按顺序运行,则可以在 Linux 上使用 numactl。

从SuperUser 的这个答案中可以看出,您可以使用以下命令限制程序一次执行一个线程

numactl --physcpubind=+1 /path/to/your/executable
Run Code Online (Sandbox Code Playgroud)

来自numactl文档:

--physcpubind=cpus, -C cpus

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

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