A strand通常會比單線程執行得更好。這是因爲一個鏈讓調度器和程序邏輯更加靈活。然而,這些差異通常並不顯着(除了我在下面討論的特例)。
例如,考慮發生需要服務的情況。對於一個鏈,可能有多個線程可以執行該服務,並且首先安排這些線程中的哪一個將執行該工作。通過一個線程,該線程必須按計劃開始工作。
例如,假設一個定時器觸發了一個新的工作來完成這個鏈。如果定時器線程調用了該線程的調度例程,則定時器線程可以在沒有上下文切換的情況下完成工作。如果你有專用的線程而不是線程,那麼定時器線程就無法完成工作,並且在定時器例程創建的工作甚至可能開始之前就需要上下文切換。
請注意,如果您只有一個線程執行鏈,您不會獲得這些好處。 (但是,國際海事組織,如果你關心的是性能,這是一種愚蠢的做法。)
對於某些應用程序,仔細將程序分解爲股線可以顯着減少所需的鎖定操作量。只能在一條鏈中訪問的對象不需要被鎖定。但是你仍然可以獲得多線程的很多優點。 (但有一個很大的缺點 - 如果你的代碼中有任何一個代碼塊會阻塞整個鏈,那麼你不必介意鏈是否停頓或者確保你的代碼不會阻塞關鍵鏈。)
在這種情況下,您可以有三條股,A,B和C,一條線可以爲股A做一些工作,一些用於股B,一些用於股C,不用上下文切換高速緩存中的數據很熱)。每個任務使用一個線程需要兩個上下文切換來完成相同的工作,而每個任務都可能無法在高速緩存中找到數據。如果你不斷地「把東西」從一條線轉移到另一條線上,股線可以明顯勝過專用線。
至於你的第二個問題,除非在一個線程中訪問數據,而可能在另一個線程中修改數據,否則不需要鎖定。如果對一個對象的所有訪問都通過一個單獨的鏈,那麼不需要鎖,因爲一個鏈只能在一個線程中一次執行。通常情況下,股會訪問一些數據,這些數據只能被該股所訪問,而另一些數據則會與其他線程或股線共享。
你能提供一些上下文來解決這個問題嗎?你用這些股來做什麼? – 2011-12-15 07:10:23
你從哪裏找到Boost.Strand?此外,你的問題究竟是什麼? – 2011-12-15 07:12:30