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

57 lines
2.1 KiB
ObjectPascal
Raw Normal View History

uses
2015-05-14 22:35:07 +03:00
System, System.Net, System.Threading.Tasks, System.Collections.Generic;
type
ListSimple = class
l := new List<int64>();
procedure AddPrime(N: int64);
2015-05-14 22:35:07 +03:00
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.AddPrime);
2015-05-14 22:35:07 +03:00
Println(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
Print(ls.l[i]);
// Надо обратить внимание, что выводится неупорядоченная последовательность простых чисел !
2015-05-14 22:35:07 +03:00
Println;
Println('Время выполнения =',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.AddPrime(i);
Println(ls1.l.Count);
2015-05-14 22:35:07 +03:00
for var i:=0 to ls1.l.Count-1 do
write(ls1.l[i],' ');
Println;
Println('Время выполнения =',Milliseconds-t);
2015-05-14 22:35:07 +03:00
// Проверка того, что списки простых как множества совпадают
Println('Количество элементов в разности множеств = ',ls.l.Except(ls1.l).Count());
2015-05-14 22:35:07 +03:00
end.