Я написал приложение Win32 (в Delphi-7, которое является 32-разрядным, используя класс TThread) для создания 100 потоков. Каждый поток при возобновлении будет непрерывно (в цикле) увеличивать 64-разрядный счетчик, связанный с объектом потока (таким образом, блокировка или совместное использование данных).
Если вы позволяете системе работать от 10 до 15 секунд и останавливаться после этого, вы должны увидеть примерно одинаковые подсчеты в каждом из потоков. Но то, что я наблюдал, было то, что 81 поток работал под 400 миллионами циклов, а остальные - более чем в 950 миллионов раз. Самая медленная нить получила только 230 миллионов по сравнению с самыми быстрыми 2111 миллионами.
Согласно MSDN, упреждающая многозадачность находится на уровне нити (а не на уровне процесса), поэтому каждый из моих потоков должен получить свой временной срез круговым способом. Что мне здесь не хватает и почему это несоответствие?
Edit1: Конфигурация машины: Intel i7 Quad Core 3,4 ГГц с включенной поддержкой гиперпотока (8 активных потоков за раз). Запуск 64-разрядной версии Windows-7 (а тестовое приложение - 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;