為多重核心電腦最佳化 Managed 程式碼

by | |
先裝這個Reactive Extensions for .NET (Rx)
http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

說明
http://msdn.microsoft.com/zh-tw/magazine/cc163340.aspx

彙總
For 迴圈通常用於網域中進行反覆運算並將值彙總成單一結果。例如,下面的反覆運算會將小於 100 的質數加總:
複製程式碼
int sum = 0;
for(int i = 0; i < 100; i++) {
if (isPrime(i)) sum += i;
}

不過,我們不能依現狀平行處理此迴圈,因為平行處理會導致資料競爭。每一次反覆運算都會修改共用的 sum 變數,而且無鎖定保護。如果兩個並行反覆運算同時使 sum 增加,則它們可能會同時讀取到暫存器中的相同值,進行加總,並寫回其結果 -- 我們可能因而失去一次加總內容。正確的版本是使用鎖定來保護加總內容,如下所示:
複製程式碼
int sum = 0;
Parallel.For(0, 100, delegate(int i) {
if (isPrime(i)) {
lock (this) { sum += i; }
}
});

0 意見:

張貼留言

Related Posts Plugin for WordPress, Blogger...