2015-05-14 22:35:07 +03:00
|
|
|
|
uses
|
|
|
|
|
|
System, System.Net, System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
Int = class
|
|
|
|
|
|
N: int64;
|
|
|
|
|
|
constructor(NN: int64);
|
|
|
|
|
|
begin
|
|
|
|
|
|
N := NN;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function IsPrime: boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
for var i: int64 := 2 to round(sqrt(N)) do
|
|
|
|
|
|
if N mod i = 0 then
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
exit;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
BTask = Task<boolean>;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
2015-12-28 14:25:15 +03:00
|
|
|
|
var ss: array of int64 := (1265713689122381, 1265713689122461, 1265713689142451, 1265713689542501); // Все числа - простые
|
2015-05-14 22:35:07 +03:00
|
|
|
|
var tb := new BTask[4];
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Запуск 4 потоков из пула потоков
|
|
|
|
|
|
// У каждого tb[i] свой Result!
|
2015-05-14 22:35:07 +03:00
|
|
|
|
for var i := 0 to ss.Length - 1 do
|
|
|
|
|
|
tb[i] := Task.Factory.StartNew((new Int(ss[i])).IsPrime);
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Если поток не закончился, то обращение к tb[i].Result приостанавливает основную программу
|
2015-05-14 22:35:07 +03:00
|
|
|
|
for var i := 0 to tb.Length - 1 do
|
|
|
|
|
|
writeln(tb[i].Result);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// В эту точку мы попадем только после окончания всех четырех потоков
|
2015-05-14 22:35:07 +03:00
|
|
|
|
writeln(Milliseconds);
|
|
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
// Последовательное выполнение
|
2015-05-14 22:35:07 +03:00
|
|
|
|
var t := Milliseconds;
|
|
|
|
|
|
for var i := 0 to ss.Length - 1 do
|
|
|
|
|
|
writeln((new Int(ss[i])).IsPrime);
|
|
|
|
|
|
writeln(Milliseconds - t);
|
|
|
|
|
|
end.
|