3

私のプログラムはマルチスレッドです。各スレッドは、データの特定のチャンクを担当します。私がやっていることは、下限と上限を計算し、それらを構造体を介してスレッド関数に渡すことです。lower_bound と upper_bound はどちらも符号なし整数です。

メインスレッドには、次の下限と上限があります。

lower_bound: 3;
upper_bound: (NUM/num_threads) - 1;

他のワーカー スレッドには、次の下限と上限があります。

lower_bound = (NUM * (i + 1))/(num_threads);
upper_bound = (NUM * (i + 2))/(num_threads) - 1;

NUM は私のプログラムで定義された定数です。このプログラムは、ある程度までは正常に動作することに気付きました。10^8 は正常に機能しますが、10^9 は機能しません。プログラムをデバッグするために、ワーカー スレッドに出力を出力させます。

10^8 までの 10 スレッドの出力。

lower_bound: 10000000    upper_bound: 19999999
lower_bound: 20000000    upper_bound: 29999999
lower_bound: 30000000    upper_bound: 39999999
lower_bound: 60000000    upper_bound: 69999999
lower_bound: 70000000    upper_bound: 79999999
lower_bound: 50000000    upper_bound: 59999999
lower_bound: 80000000    upper_bound: 89999999
lower_bound: 40000000    upper_bound: 49999999
lower_bound: 90000000    upper_bound: 99999999

10^9 までの 10 スレッドの出力。

lower_bound: 100000000   upper_bound: 199999999
lower_bound: 200000000   upper_bound: 299999999
lower_bound: 300000000   upper_bound: 399999999
lower_bound: 70503270    upper_bound: 170503269
lower_bound: 170503270   upper_bound: 270503269
lower_bound: 270503270   upper_bound: 370503269
lower_bound: 370503270   upper_bound: 41006539
lower_bound: 41006540    upper_bound: 141006539
lower_bound: 400000000   upper_bound: 70503269

世界で何が起こっているのですか?

4

2 に答える 2

2

整数オーバーフロー。符号なしの 32 ビット整数があり、最大値は 40 億強です。その後、一周してまたゼロからやり直します。

代わりに 64 ビット整数を使用するように変更します (uint64_tまたはunsigned long long)。

于 2012-11-20T03:42:07.687 に答える
0

32 ビット整数のオーバーフローが発生しています。4 * 10^9 は 2^32 より少し小さいですが、5 * 10^9 の方が大きくなります。(5 * 10^9 - 2^32) = 705032704. 10 で割って余りを捨てると 70503270 が得られます. 1 を引くと 70503269 が得られます.

于 2012-11-20T03:51:16.403 に答える