2009-11-15 4 views
2

스레드 특정 데이터의 사용 예를 아는 사람이 있습니까? 나는 명확하게 설명되고 이해하기 쉬운 것을 찾고 있습니다. 몇 가지 스레드간에 공유하고 싶은 글로벌 char * 변수가 있는데이 C 스레드의 특정 데이터 메커니즘이 무엇인지 생각하고 있습니다. 맞습니까?C의 스레드 특정 데이터 예

나는 리눅스 사용자입니다!

답변

4

원래 C 런타임 라이브러리에서 errno 변수 인 좋은 본보기. 프로세스에 시스템 호출을하는 두 개의 쓰레드가 있다면, 공유 변수가되는 것은 매우 나쁘다.

스레드 1 :

int f = open (...); 
if (f < 0) 
    printf ("error %d encountered\n", errno); 

스레드 2 : 오픈 소켓이 같은 시간에 호출하는 경우

 
int s = socket (...); 
if (s < 0) 
    printf ("error %d encountered\n", errno); 

모두가 어떻게 든 실패, 둘 다 오류를 표시하려고하면 혼란을 상상해 번호!

이 문제를 해결하기 위해 다중 스레드 런타임 라이브러리가 errno를 스레드 별 데이터 항목으로 만듭니다.

3

질문에 대한 간단한 대답은 여러 스레드간에 변수를 공유하기 위해 아무 것도 할 필요가 없다는 것입니다. 모든 전역 변수는 기본적으로 모든 스레드간에 공유됩니다.

변수를 사용하면 ISO-C99 준수 구현 (GCC 등) 만 같이 당신의 변수 선언에 __thread 저장 클래스 키워드를 추가해야합니다 사용하는 경우, 각 스레드에 대해 서로 다른되어야 할 때 :

__thread char *variable; 

이렇게하면 건물 체인의 모든 계층 (cc, ld, ld.so, libc.so 및 libpthread.so)이이 변수를 특수한 스레드 특정 방식으로 조작하도록 지시합니다.

다음 컴파일러는이 구문을 지원 (CF wikipedia) :

  • 썬 스튜디오 C/C++
  • IBM XL C/C++
  • GNU C
  • 인텔 C/C++ (Linux 시스템)
  • 볼랜드 C++ 빌더 사실
+0

ISO-C99 표준의 일부인 '__thread'에 대한 참조가 있습니까? – pmg

+0

@pmg : gcc 문서에서이 기능은 C99 구현의 일부로 문서화되어 있습니다. http://gcc.gnu.org/onlinedocs/gcc/C99-Thread_002dLocal-Edits.html – Jerome

6

, 스레드-SP 생태 데이터는 스레드간에 데이터를 공유하고 싶지 않을 때 사용됩니다. 스레드 별 데이터로 각 스레드는 동일한 변수 이름을 사용할 수 있지만 그 변수는 고유 한 저장 영역을 나타냅니다.

gcc를 사용하면 "__thread"속성을 사용하여 스레드 특정 변수를 선언 할 수 있습니다.당신이 단지 원시 타입을 쓰레드에만 한정하려고한다면, 당신은 리눅스와 GCC만을 다루고있다. 이것은 가능한 해결책이다. 다양한 유닉스 (바람직한 목표) 사이에서 또는 실제로 유닉스 루틴을 사용해야 할 때보 다 복잡한 데이터 유형을 스레드별로 작성하려는 경우, 실제로 이식성을 원한다면 ...

UNIX에서 작동하는 방식은 고유 한 변수 이름을 만들기 위해 스레드를 생성하기 전에 phread_key_create을 사용한다는 것입니다. 그런 다음 phread_setspecificpthread_getspecific을 사용하여 키와 관련된 데이터를 수정/액세스합니다. set/get 특정 기능의 의미는 키가지도에 색인으로 작용하여 각 스레드가 자체지도를 가지므로 다른 스레드에서 이러한 루틴을 실행하면 다른 데이터에 액세스/수정 될 수 있습니다. 맵을 사용할 수 있으면 스레드 별 저장 영역을 사용할 수 있습니다.

분명히, 끝나면 데이터를 정리하기 위해 적절한 루틴을 호출해야합니다. pthread_cleanup_push을 사용하여 스레드 별 키와 연관된 데이터 구조를 할당 해제하는 정리 루틴을 예약 할 수 있으며 키가 더 이상 사용되지 않을 때 pthread_key_destroy을 사용할 수 있습니다.