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());
}
}
'temp ++' không an toàn chỉ. – SLaks
@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? –
@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