菜鳥學習並行編程,參考《C#並行編程高級教程.PDF》,如有錯誤,歡迎指正。
TPL中引入了一個新命名空間System.Threading.Tasks,在該命名空間下Task是主類,表示一個類的異步的並發的操作,創建並行代碼的時候不一定要直接使用Task類,在某些情況下可以直接使用Parallel靜態類(System.Threading.Tasks.Parallel)下所提供的方法,而不用底層的Task實例。
Parallel.Invoke
試圖將很多方法並行運行,如果傳入的是4個方法,則至少需要4個邏輯內核才能足以讓這4個方法並發運行,邏輯內核也稱為硬件線程。
需要注意的是:1.即使擁有4個邏輯內核,也不一定能夠保證所需要運行的4個方法能夠同時啟動運行,如果其中的一個內核處於繁忙狀態,那麼底層的調度邏輯可能會延遲某些方法的初始化執行。
2.通過Parallel.Invoke編寫的並發執行代碼一定不能依賴與特定的執行順序,因為它的並發執行順序也是不定的。
3.使用Parallel.Invoke方法一定要測量運行結果、實現加速比以及邏輯內核的使用率,這點很重要。
4.使用Parallel.Invoke,在運行並行方法前都會產生一些額外的開銷,如分配硬件線程等。
好處:這是一種並行運行很多方法的簡單方式,使用Parallel.Invoke,不需要考慮任務和線程的問題。
下面貼代碼:
class Program { private static List<Product> ProductList = null; /* coder:釋迦苦僧 * 沒有特定的執行順序 * 示例中 基於電腦配置 采用了4個方法的並行編程 * Parallel.Invoke 首先會嘗試並行啟動4個方法,充分利用一個或多個物理處理器所提供的多個邏輯內核 * 但是在實際的並行執行中,至少要有4個邏輯內核才能滿足4個方法的並行運行 * 如果有個或者多個邏輯內核處於繁忙狀態,那麼底層的調度邏輯可能會延遲某些方法的初始化執行 * 通過Parallel.Invoke編寫的並發執行代碼一定不能依賴與特定的執行順序,因為它的並發執行順序也是不定的。 */ static void Main(string[] args) { ProductList = new List<Product>(); Thread.Sleep(3000); Stopwatch swTask = new Stopwatch(); swTask.Start(); /*執行並行操作*/ Parallel.Invoke(SetProcuct1_500, SetProcuct2_500, SetProcuct3_500, SetProcuct4_500); swTask.Stop(); Console.WriteLine("500條數據 並行編程所耗左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a << 2 將a的二進制位左移2位,右補0,
左移1位後a = a * 2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
右移運算符(>>)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進制位右移2位,
左補0 or 補1 得看被移數是正還是負。
左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a << 2 將a的二進制位左移2位,右補0,
左移1位後a = a * 2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
右移運算符(>>)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進制位右移2位,
左補0 or 補1 得看被移數是正還是負。