2011-06-11 4 views

답변

4

TLS는 스레드와 관련된 사용자 세션 컨텍스트 정보와 같은 것들에 유용하지만 관련없는 다양한 방법에 사용될 수 있습니다. 이러한 상황에서 TLS는 정보를 호출 스택의 위아래로 전달하는 것보다 편리합니다.

+0

을 언급하고 그 모두가 같은 데이터를 사용하면 TLS를 사용하여 스택을 통해 데이터를 전달하지 않습니다. –

+1

예. 예를 들어, 로그인 한 사용자를 알기 위해 코드의 여러 지점에서 필요한 경우 로그인 된 사용자를 모든 메서드에 전달하는 대신 해당 정보를 TLS에 저장하는 것이 더 쉽습니다. – btreat

+1

이해가 정확하지만 스택의 구문 분석이 훨씬 우수합니다. –

1

스레드 로컬 저장소는 스레드 단위로 전역 변수 또는 정적 변수를 에뮬레이트하는 데 사용할 수 있습니다. "보통"로컬 변수는 사용할 수 없습니다.

+1

그리고 스레드 별 전역 변수는 무엇입니까? –

+0

그것은 f.e.를 줄 수있다. mishmashru가 스레드 함수에서 호출 된 많은 함수를 가지고있을 때 – str14821

7

지역 변수를 사용할 수 있다면 그렇게하고 지역 변수를 사용할 수 있습니다. 마지막 수단으로 전역 변수와 거의 동일한 단점을 겪고있는 스레드 로컬 저장소를 사용해야합니다. 스레드 로컬 저장소를 사용해야하는 이유를 찾고 있지만 사실 가장 좋은 방법은이를 방지 할 방법을 찾는 것입니다. 내가 TLS를 사용하여 하나의 아주 좋은 예를 알고 https://software.intel.com/en-us/articles/use-thread-local-storage-to-reduce-synchronization

3

다음은 동기화를 줄이기 위해 스레드 로컬 저장소를 사용하는 방법에 대한 인텔의 좋은 링크입니다. LIBC를 구현하거나 LIBC 변형 중 하나를 새 플랫폼에 이식 할 때 각 스레드마다 고유 한 'errno'변수 (단일 스레드 platfrom가 extern int errno 임)가 필요합니다. LIBC 함수는 단순히 현재 스레드의 TLS에 저장하고 errno를 호출하면 TLS에서 읽습니다. TLS는 모든 라이브러리 스레드를 안전하게 만드는 방법입니다. 다른 스레드에서 호출되는 동일한 함수가 다른 스레드의 '정적'또는 '전역'변수를 손상시키지 않도록 TLS에서 '정적'또는 '전역'데이터에 모든 종류를 저장합니다. 그러면 다른 스레드에서 함수가 다시 입력됩니다.

+1

이 게시물을 건너 뛰었지만 나중에이 기사를 읽었습니다. 나쁜 움직임, 좋은 기사! – Seralize

관련 문제