• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

Проблема Синхронизации Winapi Потоков

  • Автор темы Автор темы Vadik(R)
  • Дата начала Дата начала
V

Vadik(R)

Всё-таки осталась ещё проблемка с мнопоточностью в делфи. Хочу сделать так, чтобы поток получал уникальное число, затем обрабатывал как-то его, но не получается раздавать потокам уникальные числа для обработки. Подскажите, в чём может быть проблема?
Вот код:
Код:
program MultiThread;

{$APPTYPE CONSOLE}

uses
Classes, SysUtils, Windows;

var
Finish, i, Number, Start, ThreadsCount: Integer;
Mutex: THandle;
ThreadId: Cardinal;
Threads: Array [1..100] of THandle;

function GetNext: Integer;
begin
WaitForSingleObject(Mutex, INFINITE);
Result := Number;
if Number <= Finish then
begin
Number := Number + 1;
end;
ReleaseMutex(Mutex);
Writeln('Current number is: ', Result);
end;

function GrabbingThread(Parameter: Pointer): Cardinal; stdcall;
var
Number: Integer;
begin
Number := GetNext;
while Number <= Finish do
begin
Number := GetNext;
end;
Result := 0;
end;

begin
IsMultiThread := True;
Write('From id: ');
Readln(Start);
Write('To id: ');
Readln(Finish);
Write('Number of threads: ');
Readln(ThreadsCount);
Mutex := CreateMutex(nil, False, nil);
Number := Start;
for i := 1 to ThreadsCount do
begin
Threads[i] := CreateThread(nil, 0, @GrabbingThread, nil, 0, ThreadId);
end;
WaitForMultipleObjects(ThreadsCount, @Threads, True, INFINITE);
for i := 1 to ThreadsCount do
begin
CloseHandle(Threads[i]);
end;
CloseHandle(Mutex);
Readln;
end.
И результат его работы:
d557e8f3c6c9.png
 
И снова, стоило только отписаться о проблеме на форуме, как пришло озарение:
Код:
program MultiThread;

{$APPTYPE CONSOLE}

uses
Classes,
SysUtils,
Windows;

var
Finish, i, Number, Start, ThreadsCount: Integer;
Mutex: THandle;
Records: Array [1..100] of Integer;
ThreadId: Cardinal;
Threads: Array [1..100] of THandle;

function GetNext: Integer;
begin
WaitForSingleObject(Mutex, INFINITE);
Result := Number;
if Number <= Finish then
begin
Number := Number + 1;
end;
ReleaseMutex(Mutex);
Writeln('Current number is: ', Result);
end;

function GrabbingThread(Parameter: Pointer): Cardinal; stdcall;
var
Number: Integer;
begin
Number := GetNext;
while Number <= Finish do
begin
Records[Number] := Number;
Number := GetNext;
end;
Result := 0;
end;

begin
IsMultiThread := True;
Write('From id: ');
Readln(Start);
Write('To id: ');
Readln(Finish);
Write('Number of threads: ');
Readln(ThreadsCount);
Mutex := CreateMutex(nil, False, nil);
Number := Start;
for i := 1 to ThreadsCount do
begin
Threads[i] := CreateThread(nil, 0, @GrabbingThread, nil, 0, ThreadId);
end;
WaitForMultipleObjects(ThreadsCount, @Threads, True, INFINITE);
for i := 1 to ThreadsCount do
begin
CloseHandle(Threads[i]);
end;
CloseHandle(Mutex);
Readln;
for i := 1 to Finish - Start + 1 do
begin
Writeln(Records[i]);
end;
Readln;
end.
Дело всё в том, что я многопоточно пытаюсь вывести в стандартный поток вывода, вот он и глючит. Сами потоки получают нужные числа:
644d4317bd98.png
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD