1

我想了解TPL的多個低級別操作,並想知道如何爲並行處理數據鎖定,例如在二維數組上執行計算。我一直在MSDN的圈子裏走,並沒有找到一個詳細的解釋。有什麼建議麼?如何做一個TPL的Parallel.For處理數據鎖定

+0

IME,TPL完全不處理這個問題。線程助手有各種限制。文件鎖定是其中之一。如果你願意,「自動併發」僅限於內存問題。 Windows Workflow Foundation遭受類似問題。有時舊學校多線程是要走的路(waithandles等)。 –

+0

TPL不是「線程助手」,Workflow Foundation也不適合甚至用於細粒度併發。事實上,PLINQ和TPL實現了不同的併發範例(任務併發與數據併發)。線程只是用來處理任務/數據的方式。一的TaskScheduler可以使用纖維,外部流程或遠程機器來執行它的有效載荷,它不會是任務本身或lambda表達式 –

回答

0

它不需要任何鎖定,因爲從來就沒有在多個線程訪問內存中的相同位置的任何情況。有一個單一的線程是爲工作人員安排工作,將部分工作切割出來並分發給他們。因爲只有一個線程正在執行此操作,所以不需要與其他人同步。沒有一個工作人員(應該)正在共享數據。

+0

這實際上取決於什麼樣的代碼是內部循環可見。您當然可以使用需要鎖定的'Parallel.For()'編寫代碼。 – svick

1

如果你訪問/修改共享可變狀態的體內循環,同步的訪問是由你。

0

我會發佈一個過於簡單化畫在代碼中的圖片;發佈到控制檯應用程序,它會吐出數據和哪個線程正在處理它。您可以更新此數據以處理您自己的數據以使其更具相關性。

 var list = new List<int>(64); 

     for (var i = 1; i <= 64; i++) 
     { 
      list.Add(i); 
     } 

     var result = Parallel.ForEach(list, entry => 
     { 
      var line = string.Format("Thread ID {0} is listing entry {1}", Thread.CurrentThread.ManagedThreadId, entry); 
      Console.WriteLine(line); 
     }); 

     while (!result.IsCompleted) 
     { 
      Thread.Sleep(50); 
     } 

     Console.ReadKey(); 
+1

這是如何回答這個問題的? – svick