2016-01-20 85 views
0

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

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

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

编辑: 我可以使用taskset运行可执行文件,然后执行cat/proc //状态给了我:

状态:R(运行) TGID:1623 PID:1623 PPID:31002 TracerPid:0 发表于: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:62004分之2 SigPnd:0000000000000000 ShdPnd:0000000000000000 SigBlk:0000000000000000 SigIgn:0000000000000004 SigCgt:00000001.8亿 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

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

+1

你都知道,图书馆将可能/可能不会再工作,如果你只允许1个线程?你可能是想限制执行你的可执行文件到单个内核? –

+0

我需要测试可能性。我知道这可能行不通。 可执行文件使用lib,所以我不明白你的意思是“限制可执行文件而不是lib”。当我运行可执行文件时,它会从lib中调用多线程函数。 – mousomer

+1

是的,图书馆依赖于这些线程。假设库在2个不同的线程中处理2个消息队列。如果您现在消除了多线程:允许哪个线程/消息队列运行?那另一个呢?图书馆使用pthreads可能有一个原因。 –

回答

1

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

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

这是一般的想法。无论线程是否真的需要,如果一个库被设计成多线程,你不能简单地使它成为单线程。但是,您可以使用taskset,正如你所说,或者sched_setaffinity()(从C/C++),以在单一内核上运行的过程。

+0

那么,任务组工作。当我使用taskset运行时,lib不会生成多个线程,并且实际运行速度提高了70%。 我仍然不确定taskset是否正是我所期待的。 – mousomer

+0

@mousomer当然有可能,库设计很糟糕,但我觉得很奇怪,它本来taskset'后'不同的行为。也许lib正在计算内核的数量,但是我不确定'taskset'会影响lib读取的数量。你有没有检查lib是否有选项来控制线程? – ElderBug

+0

我检查了,它没有线程控制器。 看起来好像该lib具有妨碍运行时的失控线程。 使用taskset,每个数据文件得到600ms,但没有它的每个文件需要2.5秒。 问题是,服务器正在运行其他的事情。使用taskset不会有问题吗?它不会干扰其他进程吗? – mousomer

0

不知道太多关于过程的内部。但是,为什么不提高你的代码库来限制创建多个线程。你可以保持线程的数量,并停止在此过程中创建线程,当计数到达超过1

相关问题