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
#동시성제어
#성능최적화
#코드안정성
'Delphi > 문법' 카테고리의 다른 글
| 동적 배열로 유연한 데이터 처리하기 (0) | 2025.10.02 |
|---|---|
| 안전한 if..else와 case 구문: Nullable 대응 패턴 (0) | 2025.09.30 |
| Generics.Collections로 타입 안전한 리스트 사용하기 (Beginner) (0) | 2025.09.24 |
| 인터페이스(Interface) 활용하기 (Advanced) (0) | 2025.09.19 |
| for..in 반복문으로 컬렉션 다루기 (Beginner) (0) | 2025.09.18 |
댓글