인프런 커뮤니티 질문&답변

HB님의 프로필 이미지
HB

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Thread Local Storage

그냥 전역변수랑 TLS랑 뭐가 다른지 아직도 모르겠어요

해결된 질문

작성

·

393

1

static string ThreadName;

이거는 일반 전역변수인데 값을 공유한다면서 왜 값이 안바뀌나요???

 

static ThreadLocal<string> ThreadName

이거는 TLS이고, 모든 스레드가 전역에 고유한 공간을 가져서

이름이 바뀔수 있다는 거 맞나요?... 전역인데 다른스레드가 접근 못하는 건가요?

 

근데 그럴거면 스택영역 쓰지 굳이 왜 전역변수로 만들어서 쓰나요...? DB나 게임 로직에서 뽑아서 쓸수 있게 하려고 전역에다 놓는건가요? (??????)

 

 

답변 1

7

Rookiss님의 프로필 이미지
Rookiss
지식공유자

전역(정적static) : 누구나 접근 가능
스택 : 현재 쓰레드만 접근 가능 BUT 함수가 끝나면 폭파되는 공간
TLS : 스택처럼 현재 쓰레드만 접근 가능 BUT 함수가 호출 완료되도 여전히 유효한 공간

이렇게 구분할 수가 있겠습니다.
즉 쓰레드끼리 경합이 일어나지 않고 안전하면서도,
반영구적으로 안전히 사용할 수 있는 공간이라는 것이죠.

HB님의 프로필 이미지
HB
질문자

헉 정말 감사합니다... 이제 그부분은 이해됐습니다!

근데 일반 전역변수인 static string ThreadName; 이 부분으로 바꿔서 실행하면 출력으로 이름이 모두 똑같이 나오는데...

누구나 접근이 가능한데 왜 스레드마다 접근해서 이름을 못바꾸고 다 똑같은 이름으로 나오나요 ....? 출력하는 시점이 다 다를텐데 값도 다르게 나와야 하는거 아닌가요??

왕기초 질문이라 죄송합니다...ㅜ

Rookiss님의 프로필 이미지
Rookiss
지식공유자

쓰레드마다 접근해서 이름을 바꿀 수 있습니다.
문제는 내가 바꾼 데이터가 모두한테 동일하게 보이는 것이죠.
[HB님의 아이디를 이제부터 AB라고 명하노라!]라고 하면
모든 사람들이 AB로 이해하는 그런 느낌입니다.

HB님의 프로필 이미지
HB
질문자

감사합니다!!

HB님의 프로필 이미지
HB

작성한 질문수

질문하기