задали написать программу на FreePascal, реализующую выполнение двух параллельных потоков....
смотрю в учебник,там ни чего не понятно...
помогите пожалуйста
Модератор: Модераторы
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7