스레드 특정 데이터의 사용 예를 아는 사람이 있습니까? 나는 명확하게 설명되고 이해하기 쉬운 것을 찾고 있습니다. 몇 가지 스레드간에 공유하고 싶은 글로벌 char * 변수가 있는데이 C 스레드의 특정 데이터 메커니즘이 무엇인지 생각하고 있습니다. 맞습니까?C의 스레드 특정 데이터 예
나는 리눅스 사용자입니다!
이스레드 특정 데이터의 사용 예를 아는 사람이 있습니까? 나는 명확하게 설명되고 이해하기 쉬운 것을 찾고 있습니다. 몇 가지 스레드간에 공유하고 싶은 글로벌 char * 변수가 있는데이 C 스레드의 특정 데이터 메커니즘이 무엇인지 생각하고 있습니다. 맞습니까?C의 스레드 특정 데이터 예
나는 리눅스 사용자입니다!
이GIYF : 샘플 코드 pthread_mutex_init
당신은 Windows 플랫폼에있는 경우가 좋은 예이다가
http://msdn.microsoft.com/en-us/library/ms686991(VS.85).aspx
원래 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를 스레드 별 데이터 항목으로 만듭니다.
질문에 대한 간단한 대답은 여러 스레드간에 변수를 공유하기 위해 아무 것도 할 필요가 없다는 것입니다. 모든 전역 변수는 기본적으로 모든 스레드간에 공유됩니다.
변수를 사용하면 ISO-C99 준수 구현 (GCC 등) 만 같이 당신의 변수 선언에 __thread 저장 클래스 키워드를 추가해야합니다 사용하는 경우, 각 스레드에 대해 서로 다른되어야 할 때 :
__thread char *variable;
이렇게하면 건물 체인의 모든 계층 (cc, ld, ld.so, libc.so 및 libpthread.so)이이 변수를 특수한 스레드 특정 방식으로 조작하도록 지시합니다.
다음 컴파일러는이 구문을 지원 (CF wikipedia) :
, 스레드-SP 생태 데이터는 스레드간에 데이터를 공유하고 싶지 않을 때 사용됩니다. 스레드 별 데이터로 각 스레드는 동일한 변수 이름을 사용할 수 있지만 그 변수는 고유 한 저장 영역을 나타냅니다.
gcc를 사용하면 "__thread"속성을 사용하여 스레드 특정 변수를 선언 할 수 있습니다.당신이 단지 원시 타입을 쓰레드에만 한정하려고한다면, 당신은 리눅스와 GCC만을 다루고있다. 이것은 가능한 해결책이다. 다양한 유닉스 (바람직한 목표) 사이에서 또는 실제로 유닉스 루틴을 사용해야 할 때보 다 복잡한 데이터 유형을 스레드별로 작성하려는 경우, 실제로 이식성을 원한다면 ...
UNIX에서 작동하는 방식은 고유 한 변수 이름을 만들기 위해 스레드를 생성하기 전에 phread_key_create을 사용한다는 것입니다. 그런 다음 phread_setspecific 및 pthread_getspecific을 사용하여 키와 관련된 데이터를 수정/액세스합니다. set/get 특정 기능의 의미는 키가지도에 색인으로 작용하여 각 스레드가 자체지도를 가지므로 다른 스레드에서 이러한 루틴을 실행하면 다른 데이터에 액세스/수정 될 수 있습니다. 맵을 사용할 수 있으면 스레드 별 저장 영역을 사용할 수 있습니다.
분명히, 끝나면 데이터를 정리하기 위해 적절한 루틴을 호출해야합니다. pthread_cleanup_push을 사용하여 스레드 별 키와 연관된 데이터 구조를 할당 해제하는 정리 루틴을 예약 할 수 있으며 키가 더 이상 사용되지 않을 때 pthread_key_destroy을 사용할 수 있습니다.
저는 리눅스 사용자입니다. 감사합니다 ... – Bill