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
所以,显然,它可以运行单线程。
如果您不关心生成线程而只希望程序按顺序运行,则可以在 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 上执行。这意味着一次只能运行一个线程。