Delphi-Quellcode:
type
PIP = ^TIP;
TIP =
record
IP,StartPort,EndPort: DWORD;
NumThreads: DWORD;
end;
var
IP: TIP;
function ScanThread(I: DWORD): DWORD;
stdcall;
var
Counter: DWORD;
// Local remainder
begin
Result := 0;
Counter := 0;
while (
IP.StartPort + I + Counter) <=
IP.EndPort
do
begin
Write(
IP.StartPort + I + Counter, '
, ' );
Inc(Counter,
IP.Numthreads);
end;
end;
procedure Test;
var
I: Integer;
begin
IP.NumThreads := 6;
IP.StartPort := 1;
IP.EndPort := 18;
for I := 0
to IP.NumThreads -1
do
if I > 3
then Break
else ScanThread(I);
end;
In obigem Code simmuliere ich mal deinen Algo. Aber so als ob 6 Threads laufen sollten aber nur 3 Threads durch's Operation System erzeugt wurden. D.h. die Schleife mit der Erzeugung der Threads erzeugt nur Threads 0,1,2 und Threads 3,4,5 werden durch's
OS nicht erzeugt.
Die Threadfunction ScanThread() wird direkt aufgrufen, statt wie bei Threads im eigenen Context.
Das WriteLn sollte alle Ports von 1 bis 18 ausgeben, ich erhalte aber nur (1, 7, 13) + (2, 8, 14) + (3, 9, 15) + (4, 10, 16). Also genau wie ich es gesagt habe.
Wird also NumThreads = 2048 angegeben und das
OS lässt aber nur 128 Threads zu, dann bleiben Lücken.
Und hier meine Lösung:
Delphi-Quellcode:
type
PIP = ^TIP;
TIP =
record
IP,StartPort,EndPort: DWORD;
NumThreads: DWORD;
end;
var
IP: TIP;
function ScanThread(I: DWORD): DWORD;
stdcall;
var
Port: Integer;
begin
Result := 0;
repeat
Port := InterlockedExchangeAdd(@
IP.StartPort, 1);
if Port >
IP.EndPort
then Break;
Write( Port, '
, ' );
until False;
end;
procedure Test;
var
I: Integer;
begin
IP.NumThreads := 6;
IP.StartPort := 1;
IP.EndPort := 18;
for I := 0
to IP.NumThreads -1
do
if I > 3
then Break
else ScanThread(I);
end;
Ausgabe:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
Der Schönheitsfehler dabei ist nur das ScanThread() hier nicht als separater Thread parallel ausgeführt wird. Aber das Prinzip bleibt gleich.
Übrigens, wenn du globale Variablen unschön findest, warum ist
IP: TIP auch global ??
Gruß Hagen