1

// 코드 1두 포인터가 같은 코드 1에서 멀티 스레드 thread_specific_ptr 혼란

static boost::thread_specific_ptr<StreamX> StreamThreadSpecificPtr; 
void thread_proc() { 
    StreamX * stream = NULL; 
    stream = StreamThreadSpecificPtr.get(); 
    if (NULL == stream) { 

     stream = new StreamX(); 
     StreamThreadSpecificPtr.reset(stream); 
    } 
    printf("%p\n", stream); 
} 
int run() { 
    boost::thread_group threads; 
    for(int i = 0; i < 5; i ++) { 
     threads.create_thread(&thread_proc); 
    } 
    threads.join_all(); 
} 

// the result is 
0x50d560 -- SAME POINTER 
0x50d540 
0x50bfc0 
0x50bef0 
0x50d560 -- SAME POINTER 

// 코드 2

static boost::thread_specific_ptr<StreamX> StreamThreadSpecificPtr(NULL); // DIFF from code snippet 1 
void thread_proc() { 
    StreamX * stream = NULL; 
    stream = StreamThreadSpecificPtr.get(); 
    if (NULL == stream) { 

     stream = new StreamX(); 
     StreamThreadSpecificPtr.reset(stream); 
    } 
    printf("%p\n", stream); 
} 
int run() { 
    boost::thread_group threads; 
    for(int i = 0; i < 5; i ++) { 
     threads.create_thread(&thread_proc); 
    } 
    threads.join_all(); 
} 

// the result is 
0x50d510 
0x50d4f0 
0x50bf70 
0x50ca70 
0x50be50 

이다. 그것은 예상되지 않습니다. 코드 스 니펫 2에서 StreamThreadSpecificPtr을 NULL로 초기화하면 모든 것이 잘 맞습니다.

이 혼란에 대한 답변을 찾으려면 도와주십시오. 고마워.

답변

2

실제로 스레드가 비동기식으로 종료되어 StreamX 인스턴스가 파괴됩니다.

struct StreamX 
{ 
    StreamX() { puts(__FUNCTION__); } 
    ~StreamX() { puts(__FUNCTION__); } 
}; 

나는 다음과 같은 출력을 얻을 :

검출기를 사용

StreamX 
0x7f258c0008c0 
~StreamX 
StreamX 
0x7f25740008c0 
~StreamX 
StreamX 
0x7f25840008c0 
~StreamX 
StreamX 
0x7f25780008c0 
StreamX 
~StreamX 
0x7f257c0008c0 
~StreamX 

real 0m0.002s 
user 0m0.000s 
sys 0m0.004s 

관련된 많은 조각이되지 않기 때문에 이후의 할당이 같은 힙 주소를 재사용하는 것은 의미가 있습니다. 즉, 포인터를 비교하여 동시 응용 프로그램에서 동일한 개체의 별칭인지 여부를 확인할 수 없습니다.

두 번째 예제와의 차이점은 단지 가짜입니다. 결과에 영향을 미칠 수있는 많은 요소가 있습니다. 예 : 각 스레드의 끝에 작은 지연을 추가하면 다른 인스턴스가 인스턴스화되기 전에 스레드가 종료 될 수있는 모든 기회가 제거됩니다.

Live On Coliru

+0

항상 즐거움이 답변을보고 참조하십시오. –