[Rust 공식문서 한국어 정리] 70. Rust thread_local 가이드
[Rust 공식문서 한국어 정리] 70. Rust thread_local 가이드
원문 제목: std::thread_local — Rust Standard Library
작성자: Rust Standard Library Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust에서 thread_local! 매크로를 사용하여 스레드 로컬 저장소(Thread-Local Storage, TLS)를 구현하는 방법을 설명합니다.
각 스레드가 독립적인 변수 인스턴스를 가지는 메커니즘과, TLS의 수명, 초기화, 그리고 접근 패턴을 다룹니다.
std::cell::RefCell과의 조합, Send/Sync와의 상호작용, 그리고 TLS의 성능 특성을 중심으로 설명합니다.
스레드 안전하지 않은 상태를 스레드별로 격리하거나, 캐시/컨텍스트를 스레드 단위로 유지하는 패턴을 제시합니다.
멀티스레드 프로그래밍에서 공유 상태를 피하고자 하는 Rust 개발자에게 유용한 내용입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① thread_local!: 각 스레드가 독립적인 인스턴스를 갖는 변수를 선언하는 매크로입니다.
② LocalKey: thread_local!이 생성하는 키로, with 메서드를 통해 TLS에 접근합니다.
③ Lazy Initialization: TLS 변수는 첫 접근 시 초기화되며, 지연 평가 방식으로 동작합니다.
④ RefCell: TLS 내부에서 가변성을 허용하며, 런타임 borrow 검사로 안전성을 보장합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
thread_local!은 정적 변수처럼 선언하지만, 각 스레드가 독립적인 값을 갖습니다.
thread_local! { static VAR: RefCell = RefCell::new(0); }
VAR.with(|v| *v.borrow_mut() += 1)로 현재 스레드의 VAR에 접근합니다.
LocalKey::with는 클로저를 받아 TLS 값에 대한 참조를 제공합니다.
with 내부에서는 스레드의 TLS 슬롯이 존재하는지 확인하고, 없으면 초기화한 뒤 클로저를 실행합니다.
TLS는 스레드가 종료될 때까지 유지되며, Drop이 구현된 경우 스레드 종료 시 소멸됩니다.
TLS에 가변성을 부여하려면 RefCell이나 Cell을 함께 사용합니다.
Cell은 Copy 타입에, RefCell은 비Copy 타입에 적합합니다.
TLS는 스레드 단위로 격리되므로, RefCell의 borrow 검사 비용이 스레드 내에서만 발생하며, 동기화 오버헤드는 없습니다.
TLS는 Send가 구현된 타입만 저장할 수 있습니다.
스레드 간 이동이 불가능한 타입(!Send)은 TLS에 저장할 수 없습니다.
TLS 자체는 Sync가 아니므로(스레드 간 공유되지 않음), TLS 내부의 타입이 !Sync여도 문제없습니다.
성능 측면에서 TLS 접근은 일반 정적 변수보다 약간의 오버헤드가 있습니다.
대부분의 구현에서는 FS/GS 세그먼트 레지스터를 통해 TLS 영역을 참조하므로, 추가 메모리 접근이 발생합니다.
잦은 TLS 접근은 성능에 영향을 줄 수 있으므로, 루프 내에서는 TLS 값을 지역 변수로 캐싱하는 것이 좋습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
스레드별 RNG(Random Number Generator)를 TLS에 저장하여, 공유 RNG의 락 오버헤드를 피합니다.
요청 컨텍스트나 트레이싱 span을 TLS에 저장하여, 비동기 코드에서도 컨텍스트를 전파합니다.
데이터베이스 커넥션 풀을 스레드별로 TLS에 캐싱하여, 스레드 간 동기화 없이 빠른 접근을 제공합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
thread_local!은 스레드별 상태 격리를 위한 편리하고 안전한 메커니즘입니다.
RefCell/Cell과 조합하여 스레드 내 가변 상태를 동기화 없이 관리할 수 있습니다.
TLS 접근은 약간의 오버헤드가 있으므로, 루프 내에서는 캐싱을 고려하세요.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/std/macro.thread_local.html
Thread Local Storage: https://en.wikipedia.org/wiki/Thread-local_storage
#Rust #ThreadLocal #TLS #Concurrency #RefCell #Multithreading #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30