2012-04-18 35 views
2

我正在實施一個多線程程序來驗證使用英特爾®TBB的一系列數字的Collat​​z猜想,並且我無法弄清楚爲什麼原子變量<int> count(它保持有多少數字被驗證)未正確遞增。Atomic int錯誤地遞增?英特爾TBB實施

對於下面列出的相關代碼,我使用了一個小的間隔(只驗證數字1-10,但問題隨着間隔變大而縮放),並且我一直得到的計數返回值爲18。有任何想法嗎?

task_scheduler_init init(4); 
atomic<int> count; 

void main 
{ 
tick_count parallel_collatz_start = tick_count::now(); 
parallel_collatz(); 
tick_count parallel_collatz_end = tick_count::now(); 
double parallel_time = 1000 *(parallel_collatz_end - parallel_collatz_start).seconds(); 
} 

void parallel_collatz() 
{ 
    parallel_for 
    (
     blocked_range<int>(1,10), [=](const blocked_range<int>&r) 
     { for (int k = r.begin(); k <= r.end(); k++) { collatz(k); } } 
    ); 
} 


long long collatz (long long n) 
{ 
    while (n != 1) { 
     if (n%2 == 0) 
      n = (n/2); 
     else 
      n = (3*n + 1); 
    } 

    if (n == 1) { 
     count++; 
     return n; 
    } 
    return -1; 
} 

回答

2

的原因可能是在構造函數中使用了半開區間,[1, 10)這意味着1包10排他性的,這樣你就不會驗證數字1-10而是1-9。此外,您可能希望在循環條件下使用!=而不是<=

+0

謝謝。我不知道構造函數使用半開範圍!另外,將<=改爲!=解決了我的問題。 – Vance 2012-04-18 05:06:46