2011-12-15 68 views
3

由於鏈不會同時執行,鏈與單線之間的性能有什麼區別?而且,爲了保護post函數的處理程序中的共享數據,不需要鎖,對嗎?增強鏈與單線程

假設應用程序執行幾個作業,下面是一些示例代碼。

strand.post(boost::bind(&onJob, this, job1)); 

void onJob(tJobType oType) 
{ 
    if (oType == job1) 
    // do something 
    else if(oType == job2) 
    // do something 
} 

編輯:我嘗試測量從發佈和調用onJob的延遲是相當高的。我想知道是否有任何方法可以減少它

+0

你能提供一些上下文來解決這個問題嗎?你用這些股來做什麼? – 2011-12-15 07:10:23

+0

你從哪裏找到Boost.Strand?此外,你的問題究竟是什麼? – 2011-12-15 07:12:30

回答

11

A strand通常會比單線程執行得更好。這是因爲一個鏈讓調度器和程序邏輯更加靈活。然而,這些差異通常並不顯着(除了我在下面討論的特例)。

例如,考慮發生需要服務的情況。對於一個鏈,可能有多個線程可以執行該服務,並且首先安排這些線程中的哪一個將執行該工作。通過一個線程,該線程必須按計劃開始工作。

例如,假設一個定時器觸發了一個新的工作來完成這個鏈。如果定時器線程調用了該線程的調度例程,則定時器線程可以在沒有上下文切換的情況下完成工作。如果你有專用的線程而不是線程,那麼定時器線程就無法完成工作,並且在定時器例程創建的工作甚至可能開始之前就需要上下文切換。

請注意,如果您只有一個線程執行鏈,您不會獲得這些好處。 (但是,國際海事組織,如果你關心的是性能,這是一種愚蠢的做法。)

對於某些應用程序,仔細將程序分解爲股線可以顯着減少所需的鎖定操作量。只能在一條鏈中訪問的對象不需要被鎖定。但是你仍然可以獲得多線程的很多優點。 (但有一個很大的缺點 - 如果你的代碼中有任何一個代碼塊會阻塞整個鏈,那麼你不必介意鏈是否停頓或者確保你的代碼不會阻塞關鍵鏈。)

在這種情況下,您可以有三條股,A,B和C,一條線可以爲股A做一些工作,一些用於股B,一些用於股C,不用上下文切換高速緩存中的數據很熱)。每個任務使用一個線程需要兩個上下文切換來完成相同的工作,而每個任務都可能無法在高速緩存中找到數據。如果你不斷地「把東西」從一條線轉移到另一條線上,股線可以明顯勝過專用線。

至於你的第二個問題,除非在一個線程中訪問數據,而可能在另一個線程中修改數據,否則不需要鎖定。如果對一個對象的所有訪問都通過一個單獨的鏈,那麼不需要鎖,因爲一個鏈只能在一個線程中一次執行。通常情況下,股會訪問一些數據,這些數據只能被該股所訪問,而另一些數據則會與其他線程或股線共享。