2013-02-24 40 views
2

當使用線程在C編程時,在Linux shell中,我試圖減少線程開銷,基本上降低CPU時間(並使其更有效)。線程開銷性能

現在在程序中,很多線程正在創建,需要在終止之前完成一項工作。由於相互排斥,只有一個線程可以同時完成這項工作。

我知道它開始前

其他線程必須等待有一個線程做這項工作線程需要多長時間才能完成的工作。他們檢查他們是否可以完成這項工作的方式是如果滿足一個條件變量。

對於等待的線程,如果它們等待使用條件變量,使用該特定的代碼來等待(在A,B,c和d是隻是任意的東西,這僅僅是一個例子):

while (a == b || c != d){ 
    pthread_cond_wait(&open, &mylock); 
} 

這個效率如何? pthread_cond_wait代碼中發生了什麼?它是否是一個持續檢查條件變量的while循環(幕後)?

此外,由於我知道線程需要多長時間工作,因此我首先強制執行有關最短作業的調度策略,這會更有效嗎?或者這並不重要,因爲在執行這項工作的任何線程組合中,程序將花費相同的時間完成。換句話說,是否使用最短的工作首先降低了CPU等待的其他線程的CPU開銷?由於最短的工作首先似乎減少了等待時間。

+0

你可以重寫你的問題,使之clearar?此外,你想知道不使用互斥體,只是手動調節的東西? – speeder 2013-02-24 02:00:58

+1

您需要閱讀操作系統教科書。 Condvars和其他同步機制不是while()循環,高效的多線程設計非常難以避免同步,或者如果不可避免的話,儘量減少它的跨度。您正在嘗試運行b4步行。 – 2013-02-24 02:01:23

+0

好吧我試圖讓它更清晰(我編輯了上面的問題)。所以基本上我問的是,如果我使用調度策略先做最短的工作,那麼應該儘量減少沒有完成工作的線程的等待時間。正因爲如此,這是否意味着整體CPU時間減少,因爲總的等待時間縮短了?由於任何類型的等待仍然會使用一定數量的CPU時間嗎? – omega 2013-02-24 02:07:33

回答

4

用單個線程解決您的問題,然後向我們尋求幫助,確定揭示並行化的最佳位置,如果您尚未看到需要最少鎖定的途徑。要使用的最佳線程數取決於您使用的計算機。使用多於n + 1個線程沒有什麼意義,其中n是程序可用的處理器/內核的數量。爲了減少線程創建的開銷,給每個線程多個任務是個好主意。

以下是響應你的澄清編輯:在節目中大量的線程正在創建並需要在終止前做了 工作

現在。由於相互排斥,只有一個線程可以在相同的 時間完成這項工作。

否。如上所述,最多應創建n + 1個線程。互斥是什麼意思?我認爲互斥是「只有一個線程在其工作隊列中包含任務x」。這意味着沒有其他線程需要鎖定任務x。

其他線程必須等待有線程完成該任務。他們檢查他們是否可以完成這項工作的方式是 是否符合條件變量 。

給每個線程一個獨立的任務列表來完成。如果作業x是作業y的先決條件,那麼作業x和作業y理想地位於同一個列表中,以便該線程不必處理任何作業上的線程互斥對象。你有沒有探索過這條大道?

while(a == b || c!= d){ pthread_cond_wait(& open,& mylock); } 這個效率如何? pthread_cond_wait代碼中發生了什麼? 是否經常檢查 條件變量的while循環(幕後)?

爲了避免不確定的行爲,mylock必須由當前線程調用調用pthread_cond_wait之前鎖定的,所以我相信你的代碼的pthread_mutex_lock調用進入這個循環之前獲取mylock鎖。

  1. 塊的pthread_mutex_lock線程,直到它獲得鎖,這意味着每次一個線程可以調用pthread_mutex_lock和調用pthread_cond_wait(在調用pthread_cond_wait預編碼)之間執行的代碼。
  2. pthread_cond_wait釋放鎖,允許其他線程在pthread_mutex_lock和pthread_cond_wait之間運行代碼。在pthread_cond_wait返回之前,它會等待,直到它再次獲得鎖定。重複此步驟adhoc while (a == b || c != d)
  3. pthread_mutex_unlock稍後在任務完成時調用。在此之前,一次只有一個線程可以執行pthread_cond_wait和pthread_mutex_unlock(post-pthread_cond_wait代碼)之間的代碼。另外,如果一個線程正在運行pre-pthread_cond_wait代碼,那麼沒有其他線程可以運行post-pthread_cond_wait代碼,反之亦然。

因此,您可能會運行存儲作業的單線程代碼在優先級隊列中。至少你不會有不必要和過度的上下文切換。正如我剛纔所說,「用單一線程解決你的問題」。您無法對優化節省多少時間做出有意義的陳述,直到您有所需衡量爲止。

而且,因爲我知道一個線程工作多長時間,是不是更 高效的,我第一次執行調度策略有關最短工作 ?或者這並不重要,因爲在完成這項工作的線程的任何組合中,程序將花費相同的時間完成 。換句話說,是否使用最短作業首先降低CPU 開銷,以供其他線程進行等待?由於最短的工作 首先似乎較低的等待時間。

如果您要執行調度策略,請在單線程項目中執行。如果您認爲併發性將幫助您快速解決你的問題,然後暴露你完成單線程的項目,併發性,並得出測試來驗證你的信念。我建議以線程不必共享工作的方式公開併發性。

2

Pthread的基元一般是相當有效的;阻塞的東西在阻塞時通常不消耗CPU時間或忽略不計。如果您遇到性能問題,請首先查看其他位置。

不要擔心調度策略。如果您的應用程序設計爲一次只能運行一個線程,那麼您就失去了首先進行線程處理所帶來的所有成本的大部分好處。 (如果你不是強加的一切費用,如鎖定共享的變量,因爲只有一個線程在運行的時間,你是在自找麻煩的道路。)