2
我正在實施一個多線程程序來驗證使用英特爾®TBB的一系列數字的Collatz猜想,並且我無法弄清楚爲什麼原子變量<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;
}
謝謝。我不知道構造函數使用半開範圍!另外,將<=改爲!=解決了我的問題。 – Vance 2012-04-18 05:06:46