2014-07-11 18 views
1

다음 코드를 고려 a 이후스레드 로컬 전역이

#include <iostream> 
#include <thread> 

using std::cout; 
using std::thread; 

thread_local int a; 

void foo() 
{ 
    a = a + 1; 
    cout << a << "\n"; 
} 

void bar() 
{ 
    cout << a << "\n"; 
} 

void baz() 
{ 
    cout << "Something\n"; 
} 

int main() 
{ 
    thread first(foo); 
    thread second(bar); 
    thread third(baz); 
    second.join(); 
    first.join(); 
    third.join(); 
    cout << a; 
} 

Demo

스레드 저장 기간을 갖고, 우리는 적어도 세 가지 목적, a로 표기하고 first, second에 사용 있고 main 스레드. third 안에 a을 사용하지 않습니다. 세 번째로 사용할 수있는 0으로 초기화 된 a이 있습니까? 스레드 저장 기간이

비 지역 변수는 스레드 실행의 결과로 초기화 : 나는 표준이에 대해 아무것도 찾을 수 없기 때문에 나는이 질문을 부탁드립니다.

구현이 정의되어 있습니까?

+3

귀하의 질문은 비 관찰 된 행동에 관한 것입니다; 제로 초기화 된 'a'가 'third'에 존재하는지 또는 존재하지 않는지 말하는 것은 이치에 맞지 않는다. – ecatmur

+0

@ecatmur 조금 명확하지 않습니다. 0으로 초기화 된 객체가 실제로 메모리 할당을 필요로하지 않습니까? –

+0

관찰 할 수없는 의미입니다. 구현은 메모리를 할당 할 수 있지만 프로그램에는 보이지 않습니다. – ecatmur

답변

2

N3337, 3.7.2.2

스레드 저장 기간의 변수가 구성되면 첫 ODR 사용 (3.2) 전에 초기화한다은 스레드 종료에 파괴된다.

3.2.2는 여기에 복사하기에는 너무 길지만 본질적으로 실행 된 코드에 나타나지 않으면 "odr-used"될 수 없습니다. 그래서 (반드시) 무언가로 초기화되지 않습니다.