Я использую проприетарную библиотеку C ++ в linux, скомпилированную через gcc, которая использует pthreads (я должен использовать флаг -lpthreads в gcc). У меня есть обертка вокруг этого, и я знаю, что библиотека использует несколько потоков.
Библиотека динамически использует несколько потоков — когда я ее вызываю, я вижу где-то между 20 и 1 потоками. Но я не хочу использовать набор задач. (У меня запущены другие процессы, и я хочу, чтобы система администрировала ядра).
Есть ли способ заставить мой исполняемый файл использовать один поток?
Либо во время компиляции, либо во время выполнения. Благодарю.
РЕДАКТИРОВАТЬ:
Я могу запустить исполняемый файл с набором задач, а затем cat / proc // status дает мне:
Состояние: R (работает)
Tgid: 1623
Pid: 1623
PPid: 31002
TracerPid: 0
UID: 500 500 500 500
Гид: 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,000000,000000000000000000000000,00000000,00000000,00000000,00000000000000,00000000,00000000,00000000000000,00000000,00000001
Mems_allowed_list: 0
добровольные переключатели: 3460
nonvoluunte_ctxt_switches: 24907
Так что, по всей видимости, он может запускать один поток
Не зная, что вы пытаетесь сделать, есть только один ответ: вы не можете.
Как бы вы ограничили что-то, чтобы не использовать несколько потоков? Отключение pthread_create()
будет только калечить программу. Представьте, что библиотека порождает поток для выполнения асинхронной работы с файлом. Если вы запрещаете pthread_create()
, что происходит с файловыми операциями? Библиотека теперь не работает должным образом, так как она не может выполнять свои файловые операции. Вам понадобится полная модернизация библиотеки; простое уничтожение файлового ввода-вывода в том же потоке (если это вообще возможно) могло бы привести к катастрофическим последствиям, так как предполагалось, что этот поток работает вхолостую и теперь заблокирован каким-либо тяжелым вводом-выводом.
Это общая идея. Независимо от того, действительно ли нужны потоки, если библиотека была разработана как многопоточная, вы не можете просто сделать ее однопоточной. Однако вы можете использовать taskset
, как вы упомянули, или sched_setaffinity()
(из C / C ++) для запуска процесса на одном CORE.
Не знаю много о внутренних процессах. Но почему бы вам не улучшить свою кодовую базу, чтобы ограничить создание более 1 потока. Вы можете вести подсчет потоков и прекратить создавать потоки в процессе, когда число достигает более 1.