2016-01-20 2 views
0

Я использую проприетарную библиотеку C++ на linux, скомпилированную через gcc, которая использует pthreads (я должен использовать флаг -lpthreads на gcc). У меня есть обертка вокруг него, и я знаю, что библиотека использует несколько потоков.Могу ли я заставить C++-библиотеку использовать один поток?

Библиотека использует несколько потоков динамически - когда я ее называю, я вижу где угодно между 20 потоками 1. Но я не хочу использовать набор задач. (У меня есть другие процессы, и я хочу, чтобы система администрировала ядра).

Есть ли способ заставить мой исполняемый файл использовать один поток? Либо при компиляции, либо во время выполнения. Благодарю.

EDIT: я могу запустить исполняемый файл с набор задач, а затем кошка/Proc // статус дает мне:

State: 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 кБ VmSize: 345956 кБ VmLck: 0 кБVmHWM: 199816 кБ VmRSS: 188388 кБ VmData: 192120 кБ VmStk: 128 кБ VmExe: 656 кБ VmLib: 12444 кБ VmPTE: 432 кБ VmSwap: 0 кБ Тем: 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

Таким образом, очевидно, что он может работать с одной нитью.

+1

Вы знаете, что библиотека, возможно, вероятно, больше не работает, если вы разрешаете только один поток? Возможно, вы хотите ограничить выполнение своего исполняемого файла одним ядром? –

+0

Мне нужно проверить возможность. Я знаю, это может не сработать. Исполняемый файл использует lib, поэтому я не понимаю, что вы подразумеваете под «ограничением исполняемого файла, а не lib». Когда я запускаю исполняемый файл, он вызывает многопоточные функции из lib. – mousomer

+1

Да, и библиотека опирается на эти потоки. Скажем, библиотека обрабатывает 2 очереди сообщений в 2 разных потоках. Если теперь вы устраните многопоточность: какая очередь потоков/сообщений разрешена? А как насчет другой? Вероятно, есть причина, по которой библиотека использует pthreads. –

ответ

1

Не зная, что вы пытаетесь сделать, есть только один ответ: вы не можете.

Как бы вы удержали что-то, чтобы не использовать несколько потоков? Отключение pthread_create() только калечит программу. Представьте, что lib порождает поток, чтобы выполнить некоторую асинхронную работу над файлом. Если вы запретите pthread_create(), что происходит с файловыми операциями? Теперь lib работает неправильно, поскольку он не может выполнять свои файловые операции. Вам понадобится полная редизайн библиотеки; просто разбивание файла IO на том же потоке (если бы это было возможно), вероятно, было бы катастрофой, так как этот поток должен был быть свободным, и теперь он заблокирован каким-то тяжелым IO.

Это общая идея. Независимо от того, действительно ли нужны потоки, если lib был спроектирован как многопоточный, вы не можете просто сделать его однопоточным.Однако вы можете использовать taskset, как вы упомянули, или sched_setaffinity() (из C/C++) для запуска процесса на одном CORE.

+0

Ну, задача работает. Когда я запускаю с набором задач, lib не генерирует несколько потоков, и он на самом деле работает на 70% быстрее. Я все еще не уверен в том, что набор задач - именно то, что я искал. – mousomer

+0

@mousomer Конечно, библиотека плохо спроектирована, но мне кажется странным, что после 'taskset' было бы другое поведение. Возможно, lib подсчитывает количество ядер, но тогда я не уверен, что 'taskset' повлияет на число, которое читает lib. Вы проверили, есть ли у lib возможность несколько контролировать потоки? – ElderBug

+0

Я проверил, и у него нет контроллера потока. Кажется, что у lib есть беглые потоки, которые препятствуют времени выполнения. С набором задач я получаю 600 мс на файл данных, но без него 2,5 секунды. Проблема в том, что на сервере работают другие вещи. Не будет ли проблемным использовать набор задач? Разве это не будет мешать другим процессам? – mousomer

0

Не знаю много о внутренних процессах. Но почему вы не улучшаете базу кода, чтобы ограничить создание более 1 потока. Вы можете поддерживать количество потоков и прекратить создавать потоки в процессе, когда количество достигает более 1.