2015-01-17 6 views
2

동일한 함수로 두 개의 스레드를 만들면 함수의 정적 변수가 공유됩니까? 그리고 그들은 어디에서 구원 받습니까? 주 스레드의 정적 데이터에 저장하면 두 스레드에서 공유되기 때문입니다.스레드에 대한 상호 함수

코드 예제 :

void fill_g_msg(void){ 
    pthread_t t1, t2; 
    pthread_create(&t1, NULL, thread_fill, “first"); 
    pthread_create(&t2, NULL, thread_fill, “second"); 
    // wait for both threads to finish 
    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 
} 


void* thread_fill(void *arg){ 
    int a; 
    if(strcmp((char*)arg, “second”) == 0) { 
     a = 1; 
    } else { 
     a = 2; 
    } 
    return null; 
} 
+1

귀하의 예는 정적 변수가 표시되지 않습니다. –

+0

"a"변수를 의미합니다. 정적 인 것입니까? – Moawiya

+1

아니요, 명시 적으로 '정적'을 추가하지 않으면 함수의 모든 호출이 자체 로컬 변수 집합을 가져옵니다. –

답변

1

스레드의 각 기능의 다른 '예'를 실행되므로, 아니, 그들은 정확히 동일한 변수 'A'를 사용하지 않습니다.

EDIT AGAIN : 스레드가 실행중인 함수에서 int를 선언하면 각 스레드는 다른 사본을 갖게됩니다. 각 쓰레드는 자체적 인 스택을 가지고 있으며, 스택이 있어야한다.

또한 정적 변수 (어쩌면 정적 로컬을 의미)를 말할 때 어떤 의미인지 이해할 수 없습니다. this post을 확인하십시오.

+0

변수 "a"의 정확한 위치는? – Moawiya

+0

아니요 전 세계적인 "a"를 의미하지는 않았습니다. – Moawiya

+0

위의 내 대답을 다시 수정하십시오. –

1

저는 멀티 스레딩을 처음 접했고 여러분의 질문이 매우 흥미 롭습니다. 조금 주위를 검색 한 후 다음을 찾았습니다.

내 참조가 최상의 (... 위키 백과)가 아니지만 유용하다고 생각되는 정보가 있음을 이해합니다.

인용구 : 위키피디아 : "스레드 로컬 저장소 (TLS)는 스레드에 로컬 인 정적 또는 전역 메모리를 사용하는 컴퓨터 프로그래밍 방법입니다. 일반적으로 프로세스의 모든 스레드가 동일한 주소 공간을 공유하기 때문에 때때로 필요합니다. 때로는 바람직하지 않습니다. 즉, 정적 또는 전역 변수의 데이터는 일반적으로 동일한 프로세스의 스레드가 참조 할 때 항상 동일한 메모리 위치에 있습니다. 그러나 호출 스택의 변수는 스레드에 로컬입니다. 다른 메모리 위치에있는 자신의 스택 "

따라서 은 일반적으로 개의 스레드가 정적 변수를 공유합니다. 그래서 정적 변수가 둘 이상의 스레드가없는 프로세스에서 정적 변수가있는 곳과 정확히 같은 위치에 있다고 가정합니다. 물론 틀릴 ​​수도 있습니다 :-)

또한 아래 GCC 참고 자료를 보면 TLS 관련 스레드 인 정적 변수를 사용할 수 있습니다.

답변이 유용하다고 생각합니다.

행운을 빈다.

참고 문헌 : WikipediaGCC