//exp(x^2) [0..1] {$mode objfpc} uses cthreads,classes,sysutils; type ttrap=class(tthread) x0,x1:extended; num:longint; sum:extended; procedure execute; override; constructor Create(_x0,_x1:extended; _num:longint); end; constructor ttrap.Create(_x0,_x1:extended; _num:longint); begin inherited create(true); x0:=_x0; x1:=_x1; num:=_num; sum:=0.0; end; procedure ttrap.execute; var dx:extended; begin dx:=(x1-x0)/num; while num<>0 do begin sum:=sum+dx*exp(x0*x0); x0:=x0+dx; dec(num); end; end; var MaxTrap:integer; const Nums=200000000; var traps:array[1..1000] of TTrap; i:integer; DX:extended; X:extended=0; sum:extended=0; begin readln(MaxTrap); DX:=1/MaxTrap; writeln('creating ', MaxTrap, ' threads, dividers - ',Nums); for i:=1 to MaxTrap do begin traps[i]:=ttrap.Create(X,X+DX,Nums div MaxTrap); X:=X+DX; end; writeln('resuming...'); for i:=1 to MaxTrap do begin traps[i].resume; end; writeln('waiting...'); for i:=1 to MaxTrap do begin traps[i].waitfor(); end; writeln('result sums:'); for i:=1 to MaxTrap do begin write(' ',traps[i].sum:7:5); end; writeln; writeln('result'); for i:=1 to MaxTrap do begin sum:=sum+traps[i].sum; end; writeln(sum); writeln('destroying'); for i:=1 to MaxTrap do begin traps[i].destroy(); end; end.