pascalabcnet/InstallerSamples/NETLibraries/System.Parallel/Parallel3.pas

57 lines
2.1 KiB
ObjectPascal
Raw Normal View History

2015-05-14 22:35:07 +03:00
uses
System, System.Net, System.Threading.Tasks, System.Collections.Generic;
type
ListSimple = class
l := new List<int64>();
procedure AddSimple(N: int64);
begin
var Result := True;
for var i: int64 := 2 to round(sqrt(N)) do
if N mod i = 0 then
begin
Result := False;
break;
end;
// lock не позволяет нескольким потокам одновременно выполнять эту секцию.
// Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным
// Секция, охраняемая lock, называется критической
2015-05-14 22:35:07 +03:00
lock l do
if Result then
l.Add(N);
end;
end;
var hh := 1000;
begin
var ls := new ListSimple;
var ii: int64 := 1265713689181;
Parallel.For(ii,ii+hh,ls.AddSimple);
writeln(ls.l.Count);
// ls.l := ls.l.OrderBy(x->x).ToList(); - это можно включить для проверки того, что в обоих списках - одинаковые простые числа
2015-05-14 22:35:07 +03:00
for var i:=0 to ls.l.Count-1 do
write(ls.l[i],' ');
// Надо обратить внимание, что выводится неупорядоченная последовательность простых чисел !
2015-05-14 22:35:07 +03:00
writeln;
writeln('Время выполнения = ',Milliseconds);
2015-05-14 22:35:07 +03:00
// То же, но непараллельно
2015-05-14 22:35:07 +03:00
var ls1 := new ListSimple;
var t := Milliseconds;
for var i:=ii to ii+hh-1 do
ls1.AddSimple(i);
writeln(ls1.l.Count);
for var i:=0 to ls1.l.Count-1 do
write(ls1.l[i],' ');
writeln;
writeln('Время выполнения = ',Milliseconds-t);
2015-05-14 22:35:07 +03:00
// Проверка того, что списки простых как множества совпадают
writeln('Количество элементов в разности множеств = ',ls.l.Except(ls1.l).Count());
2015-05-14 22:35:07 +03:00
end.