개발/코더 탈출

T.L.S(Thread Local Storage)

-=HaeJuK=- 2024. 9. 12. 13:14
C++ TLS and GetLastError Example

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 변수를 가집니다. t1t2는 서로 독립적으로 실행되며, 각자의 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를 사용하여 각 스레드가 마지막으로 발생한 오류 코드를 독립적으로 저장하므로, 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.

반응형