티스토리 뷰
C++ Thread Local Storage (TLS) and GetLastError
1. TLS 설명
C++에서 TLS (Thread Local Storage)는 각 스레드가 고유한 변수를 저장하고 접근할 수 있게 해주는 메커니즘입니다.
TLS는 다중 스레드 환경에서 각 스레드가 서로 독립적으로 데이터를 저장할 수 있도록 도와줍니다.
thread_local
키워드를 사용하여 각 스레드마다 별도의 변수를 선언할 수 있습니다.
스레드 간 경합을 피할 수 있으므로 동기화 없이 안전한 데이터 처리가 가능합니다.
2. TLS 예제 코드
#include <iostream>
#include <thread>
thread_local int counter = 0;
void increment_counter() {
counter++;
std::cout << "Thread ID: " << std::this_thread::get_id()
<< " | Counter: " << counter << std::endl;
}
int main() {
std::thread t1(increment_counter);
std::thread t2(increment_counter);
t1.join();
t2.join();
return 0;
}
위 코드에서는 thread_local
키워드를 사용하여 각 스레드가 고유의 counter
변수를 가집니다.
t1
과 t2
는 서로 독립적으로 실행되며, 각자의 counter
값을 증가시키고 출력합니다.
3. GetLastError 구현 예시
GetLastError는 Windows API에서 마지막 오류 코드를 반환하는 함수입니다.
이 함수는 각 스레드가 마지막으로 발생한 오류 상태를 스레드별로 관리하기 위해 TLS를 사용합니다.
각 스레드는 독립적으로 오류 상태를 유지하며, GetLastError()
를 통해 자신의 오류 코드를 확인할 수 있습니다.
#include <windows.h>
#include <iostream>
#include <thread>
void example() {
// 존재하지 않는 파일 삭제 시도
BOOL result = DeleteFile("non_existent_file.txt");
if (!result) {
DWORD errorCode = GetLastError();
std::cout << "Error code: " << errorCode << std::endl;
}
}
int main() {
std::thread t1(example);
std::thread t2(example);
t1.join();
t2.join();
return 0;
}
위 코드에서는 DeleteFile
함수를 사용하여 존재하지 않는 파일을 삭제하려고 시도하고, 오류가 발생하면 GetLastError()
로 오류 코드를 확인합니다.
각 스레드는 자신만의 오류 상태를 관리하며, 서로 독립적으로 동작합니다.
4. MultiThread에서의 안전 여부
MultiThread 환경에서의 안전성은 TLS와 GetLastError
모두에서 보장됩니다.
TLS로 선언된 변수와 GetLastError()
함수는 각 스레드마다 독립적인 저장 공간을 가지므로,
여러 스레드가 동시에 실행되더라도 다른 스레드의 데이터에 영향을 미치지 않습니다.
이는 스레드 안전성을 보장하며, 스레드 간 동기화 없이도 안정적으로 데이터를 처리할 수 있습니다.
GetLastError
는 내부적으로 TLS를 사용하여 각 스레드가 마지막으로 발생한 오류 코드를 독립적으로 저장하므로,
멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- Total
- Today
- Yesterday
- C++
- 블루버블다이빙팀
- 서귀포
- 제주도
- 패턴
- 현포다이브
- Linux
- C#
- 성산블루버블
- Effective c++
- C#.NET
- 울릉도
- effective
- CMake
- C
- 블루버블다이브팀
- Windows
- Build
- C# 고급 기술
- 암호화
- 네트워크 정보
- PowerShell
- 외돌개
- 스쿠버다이빙
- OpenSource
- script
- 스쿠버 다이빙
- 서귀포블루버블
- DLL
- 블루버블
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |