我编写了一个 Win32 应用程序(在 Delphi-7 中,它是 32 位使用 TThread 类)来创建 100 个线程。每个线程在恢复时将连续(在循环中)增加与线程对象关联的 64 位计数器(因此不会锁定或共享数据)。
如果您让系统运行 10 到 15 秒然后停止,您应该会看到每个线程中的计数大致相同。但我观察到,81 个线程运行了 4 亿次以下的循环,其余的循环超过了 9.5 亿次。与最快的 21.11 亿相比,最慢的线程只有 2.3 亿。
根据 MSDN,抢占式多任务处理处于线程级别(而不是进程级别),因此我的每个线程都应该以循环方式获得其时间片。我在这里缺少什么,为什么会出现这种差异?
Edit1:机器配置:Intel i7 Quad Core 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;