Làm thế nào để thực hiện nó song song bằng cách sử dụng Interlocked.Exchange cho an toàn luồng :) Lưu ý rằng Interlocked.Exchange sẽ chỉ hoạt động với kiểu tham chiếu (ví dụ: struct hoặc cặp giá trị khóa (trừ khi được bọc trong một lớp) không làm việc để giữ giá trị max
Dưới đây là một ví dụ từ mã của riêng tôi:.
//Parallel O(n) solution for finding max kvp in a dictionary...
ClassificationResult maxValue = new ClassificationResult(-1,-1,double.MinValue);
Parallel.ForEach(pTotals, pTotal =>
{
if(pTotal.Value > maxValue.score)
{
Interlocked.Exchange(ref maxValue, new
ClassificationResult(mhSet.sequenceId,pTotal.Key,pTotal.Value));
}
});
EDIT (mã cập nhật để tránh tình trạng chủng tộc có thể ở trên):
Dưới đây là một mô hình mạnh mẽ hơn cũng cho thấy việc chọn một giá trị nhỏ nhất song song. Tôi nghĩ rằng đây đề cập đến những mối quan tâm đề cập trong các ý kiến dưới đây liên quan đến một tình trạng chủng tộc có thể:
int minVal = int.MaxValue;
Parallel.ForEach(dictionary.Values, curVal =>
{
int oldVal = Volatile.Read(ref minVal);
//val can equal anything but the oldVal
int val = ~oldVal;
//Keep trying the atomic update until we are sure that either:
//1. CompareExchange successfully changed the value.
//2. Another thread has updated minVal with a smaller number than curVal.
// (in the case of #2, the update is no longer needed)
while (oldval > curVal && oldval != val)
{
val = oldval;
oldval = Interlocked.CompareExchange(ref minVal, curVal, oldval);
}
});
Nguồn
2014-04-16 06:22:28
là từ điển của bạn cho là hoặc là ngược? –
Stephan
Bạn nói đúng, đó là. Đã sửa. –
tại sao bạn có một .Select sau khi ở đâu? Tôi không phải là lượn sóng với LINQ, chỉ cần tò mò – PositiveGuy