2016-01-20 62 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

相關問題