смотрю в учебник,там ни чего не понятно...
помогите пожалуйста

Модератор: Модераторы


uses
  sysutils {$ifdef unix},cthreads{$endif} ;
const
  threadcount = 100;
  stringlen = 10000;
var
   finished : longint;
threadvar
   thri : ptrint;
function f(p : pointer) : ptrint;
var
  s : ansistring;
begin
  Writeln('thread',longint(p),' started');
  thri:=0;
  while (thri<stringlen) do
    begin
    s:=s+'1';
    inc(thri);
    end;
  Writeln('thread ',longint(p),' finished');
  InterLockedIncrement(finished);
  f:=0;
end;
var
   i : longint;
begin
   finished:=0;
   for i:=1 to threadcount do
     BeginThread(@f,pointer(i));
   while finished<threadcount do ;
   Writeln(finished);
end.program CoreTest;
{$APPTYPE CONSOLE}
{$MODE DELPHI}
uses SysUtils{$ifdef unix},cthreads{$endif};
procedure MegaLoop(l, r: Integer);
var
  i : Integer;
  rv : single;
begin
  for i := l to r - 1 do
    rv:=sin(i);
end;
var
  t  : TSystemTime;
  ts : TTimeStamp;
  cs : TRTLCriticalSection;
  procedure ThreadProc(p: Pointer); stdcall;
  begin
    EnterCriticalSection(cs);
    MegaLoop(50000000, 100000000);
    LeaveCriticalSection(cs);
  end;
var
  ID : LongWord;
begin
  writeln('Please wait...');
// работа в 1 поток
  write('one : ');
  GetLocalTime(t);
  ts := DateTimeToTimeStamp(SystemTimeToDateTime(t));
  MegaLoop(0, 100000000);
  GetLocalTime(t);
  writeln(DateTimeToTimeStamp(SystemTimeToDateTime(t)).Time - ts.Time, ' mks');
// работа в 2 потока (по одному на каждое ядро)
  InitCriticalSection(cs);
  write('two : ');
  GetLocalTime(t);
  ts := DateTimeToTimeStamp(SystemTimeToDateTime(t));
  BeginThread(@ThreadProc);
  MegaLoop(0, 50000000);
  EnterCriticalSection(cs);
  GetLocalTime(t);
  writeln(DateTimeToTimeStamp(SystemTimeToDateTime(t)).Time - ts.Time, ' mks');
  LeaveCriticalSection(cs);
  DoneCriticalsection(cs);
  writeln('Done!');
  readln;
end.
                                          
 Вообще прикольный пример - у меня второй расчёт реально в два раза скорее выходит..
  Вообще прикольный пример - у меня второй расчёт реально в два раза скорее выходит..

program f1;
{$mode objfpc}{$H+}
uses
  sysutils {$ifdef unix}, cthreads{$endif};
var
  Sum,Fin:longint;
  mutex:TRTLCriticalSection;
function f(p:pointer):ptrint;
var n,i,g,d,pr:longint;
    mas: array[1..100] of longint;
    inp:TextFile;
begin
writeln('thread ',longint(p),'started');
EnterCriticalSection(mutex);
Try
assignFile(inp, 'input.txt');
reset(inp);
g:=0;
while not eof(inp) do
begin
g:=g+1;
readln(inp, mas[i]);
end;
Finally
close(inp);
LeaveCriticalSection(mutex);
end;
d:=random(g)+1;
writeln('thread ',longint(p),' choose number: ', mas[d]);
writeln('thread ',longint(p),'finished');
for g:=1 to mas[d] do InterLockedIncrement(Sum);
InterLockedIncrement(Fin);
f:=0;
end;
var
  x,k:longint;
begin
randomize;
x:=2;
Fin:=0;
InitCriticalSection(mutex);
for k:=1 to x do
BeginThread(@f,pointer(k));
while Fin<x do ;
DoneCriticalSection(mutex);
writeln('finished ', Fin,'threads.');
writeln('final summa = ', Sum);
readln;
end.Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: Google [Bot] и гости: 1