100 スレッドを作成する Win32 アプリケーション (TThread クラスを使用する 32 ビットの Delphi-7) を作成しました。各スレッドは、再開されると、スレッド オブジェクトに関連付けられた 64 ビット カウンターを (ループ内で) 継続的にインクリメントします (データのロックや共有はありません)。
システムを 10 ~ 15 秒間実行し、その後停止すると、各スレッドでほぼ同じカウントが表示されるはずです。しかし、私が観察したところ、81 のスレッドが 4 億回未満のループで実行され、残りのスレッドは 9 億 5000 万回以上ループしました。最速の 21 億 1100 万に比べて、最も遅いスレッドは 2 億 3000 万しかありませんでした。
MSDN によると、プリエンプティブ マルチタスキングは (プロセス レベルではなく) スレッド レベルであるため、各スレッドはラウンド ロビン方式でタイム スライスを取得する必要があります。ここで何が欠けているのですか?この不一致はなぜですか?
Edit1: マシン構成: Intel i7 クアッド コア 3.4GHz、ハイパースレッディングがオン (一度に 8 つのアクティブ スレッド)。Windows-7 64 ビット プロフェッショナルの実行 (およびテスト アプリケーションは 32 ビット)
Edit2 (スレッド コード): テスト アプリケーションは、最適化をオンにして、デバッグ情報なしでビルドされます。IDE の外部でテスト アプリケーションを実行します。
type
TMyThread = class(TThread)
protected
FCount: Int64;
public
constructor Create;
procedure Execute; override;
property Count: Int64 read FCount;
end;
{ TMyThread }
constructor TMyThread.Create;
begin
inherited Create(True);
FCount := 0;
end;
procedure TMyThread.Execute;
begin
inherited;
while not Terminated do
begin
Inc(FCount);
end;
end;