2013-01-08 48 views
5

Trong ví dụ này, đây có phải là cách sử dụng chính xác của vòng lặp Parallel.For nếu tôi muốn giới hạn số lượng chuỗi có thể thực hiện chức năng DoWork đến mười lần tại một thời điểm không? Các chủ đề khác có bị chặn cho đến khi một trong mười chuỗi có sẵn không? Nếu không, một giải pháp đa luồng tốt hơn sẽ vẫn cho phép tôi thực thi hàm đó 6000 lần như thế nào?Sử dụng đúng Parallel cho vòng lặp trong C#?

class Program 
{ 
    static void Main(string[] args) 
    { 
     ThreadExample ex = new ThreadExample(); 
    } 
} 

public class ThreadExample 
{ 
    int limit = 6411; 

    public ThreadExample() 
    { 
     Console.WriteLine("Starting threads..."); 
     int temp = 0; 
     Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i => 
     { 
      DoWork(temp); 
      temp++; 
     }); 
    } 

    public void DoWork(int info) 
    { 
     //Thread.Sleep(50); //doing some work here. 

     int num = info * 5; 

     Console.WriteLine("Thread: {0}  Result: {1}", info.ToString(), num.ToString()); 
    } 
} 
+2

'temp ++' không an toàn chỉ. – SLaks

+0

@SLaks Vâng, nó không phải là chủ đề an toàn, nhưng có ý nghĩa trong cuộc thi này không? Làm thế nào hoạt động Parallel.For? –

+1

@HamletHakobyan Ý của bạn là gì? Ý định của lập trình viên là rõ ràng; anh ta muốn đếm số nhiệm vụ đã hoàn thành. Những gì thực sự xảy ra không phải là điều tương tự, do các điều kiện chủng tộc mà có thể sẽ dẫn đến truy cập không được tăng lên đúng cách. Việc sử dụng 'interlocked.Exchange' sẽ giải quyết điều đó. Đối với 'Paralle.For', đó là một vòng lặp' for' mà các phép lặp được thực hiện (tới một mức độ nhất định) bởi nhiều luồng, song song. – Servy

Trả lời

15

Bạn cần sử dụng i được chuyển đến hàm lambda làm chỉ mục. Parallel.For giúp bạn tránh khỏi những rắc rối khi làm việc với bộ đếm vòng lặp, nhưng bạn cần sử dụng nó!

Parallel.For(0, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i => 
    { 
     DoWork(i); 
    }); 

Đối với các câu hỏi khác của bạn:

  • Vâng, điều này sẽ hạn chế một cách chính xác số lượng bài làm việc cùng một lúc.
  • Không có chủ đề nào bị chặn. Các lần lặp được xếp hàng đợi và ngay sau khi một chuỗi trở nên có sẵn, nó sẽ lặp đi lặp lại tiếp theo (theo cách được đồng bộ) từ hàng đợi để xử lý.
+0

MaxDegreeOfParallelism là những gì bạn đang tìm kiếm –

+1

@MicahArmantrout Ông ấy đã sử dụng nó trong OP; đó không phải là điều khiến anh gặp rắc rối. Câu trả lời này xác định chính xác vấn đề với mã của OP. – Servy

+0

Đây là một vấn đề với giải pháp OPs nhưng nó không trả lời bất kỳ câu hỏi cụ thể nào được yêu cầu (ngoại trừ "điều này là ok?"). – usr

Các vấn đề liên quan