본문 바로가기
Delphi/문법

TCriticalSection으로 멀티스레드 동기화하기 (Advanced)

by MonoSoft 2025. 9. 25.
728x90
반응형

TCriticalSection으로 멀티스레드 동기화하기 (Advanced)

 

델파이(Delphi)에서 멀티스레드를 활용하면 성능을 높일 수 있지만, 
동시에 여러 스레드가 같은 리소스를 접근하면 데이터 충돌이나 
불안정한 동작이 발생할 수 있습니다. 
이를 방지하기 위해 TCriticalSection을 사용하면 특정 코드 블록을 
한 번에 하나의 스레드만 실행하도록 보호할 수 있습니다.

uses
  System.SysUtils, System.Classes;

var
  Counter: Integer;

procedure Worker;
var
  I: Integer;
begin
  for I := 1 to 1000000 do
    Inc(Counter); // 여러 스레드가 동시에 접근 → 잘못된 값 발생 가능
end;

procedure Demo;
var
  T1, T2: TThread;
begin
  Counter := 0;
  T1 := TThread.CreateAnonymousThread(Worker);
  T2 := TThread.CreateAnonymousThread(Worker);
  T1.Start; T2.Start;
  T1.WaitFor; T2.WaitFor;
  Writeln('Counter = ', Counter); // 기대값: 2000000, 실제는 다를 수 있음
end;

begin
  Demo;
end.


<TCriticalSection 적용 예제>
uses
  System.SysUtils, System.Classes, System.SyncObjs;

var
  Counter: Integer;
  Lock: TCriticalSection;

procedure Worker;
var
  I: Integer;
begin
  for I := 1 to 1000000 do
  begin
    Lock.Enter;
    try
      Inc(Counter);
    finally
      Lock.Leave;
    end;
  end;
end;

procedure Demo;
var
  T1, T2: TThread;
begin
  Counter := 0;
  Lock := TCriticalSection.Create;
  try
    T1 := TThread.CreateAnonymousThread(Worker);
    T2 := TThread.CreateAnonymousThread(Worker);
    T1.Start; T2.Start;
    T1.WaitFor; T2.WaitFor;
    Writeln('Counter = ', Counter); // 올바르게 2000000 출력
  finally
    Lock.Free;
  end;
end;

begin
  Demo;
end.

TCriticalSection은 간단하고 가벼운 스레드 동기화 도구

Enter와 Leave 사이에 보호할 코드를 배치

잊지 말고 try..finally 구문으로 안전하게 관리해야 함

과도한 사용은 병목 현상을 유발할 수 있으므로 필요한 부분에만 적용

멀티스레드 환경에서는 TCriticalSection 외에도 TMonitor, TSemaphore, TEvent 등 
다양한 동기화 객체가 있음

데이터 보호 범위를 최소화하면 성능 저하를 줄일 수 있음

긴 작업은 동기화 블록 안에서 처리하지 말고, 꼭 필요한 공유 자원 접근만 보호하는 것이 좋음

 


#델파이
#Delphi
#TCriticalSection
#멀티스레드
#동기화
#스레드안전성
#TThread
#동시성제어
#성능최적화
#코드안정성

728x90
반응형

댓글