2016-08-24 7 views
0

C++에서 다음 코드를 실행하고 있습니다.배열 오프셋 C++ pthreads 반환

예상대로 실행되지만 두 번째 for 루프에서는 첫 번째 결과가 NULL이지만 모든 결과는 정확합니다.

pthread_t pthread_t_array[thread_count]; 
    int ireturn[thread_count]; 
    float chunk_elements[thread_count]; 

    for (int i = 0; i < thread_count; i++) 
    { 
     float vector_chunk[3] = {2.0,4.0,3.0}; 

     pthread_t x; 
     pthread_t_array[i] = x; 

     ireturn[i] = pthread_create(&x,NULL,worker,(void *) vector_chunk); 
    } 

    for (int i = 0; i < thread_count; i++) 
    { 
     void * result; 
     ireturn[i] = pthread_join(pthread_t_array[i],&result); 


     // THE LINES BELOW: AT i = 0, result = NULL 
     // however, at every other value of i, 14 is returned as expected. 

     if (result != NULL){ 
      chunk_elements[i] = *(float *) result; 
     } 
     free(result); 
    } 

전체 코드는 here입니다.

왜 배열 오프셋이 있을지 확신하지 못합니다. 결과가 NULL 인 경우 테스트 할 라인에서 - i = 0, 결과는 NULL이지만, 다른 모든 i는 그렇지 않습니다.) 모든 것이 올바르게 진행되고있는 것처럼 보입니다.

수정 : 실제로는 오프셋이 아니라 첫 번째 값이 NULL이므로 값이 하나 더 적습니다.

+0

유효한'pthread_t '가 아니기 때문에'pthread_t_array [i]'에 참여할 수 없습니다. (배열에있는 것이 아니라 (불필요한) 변수'x'에 저장했습니다.) – molbdnilo

+0

@molbdnilo 내가 무슨 생각을했는지 모릅니다. – bordeo

답변

0

코드가 표시되지 않는 worker() 스레드가 스레드가 수신하는 vector_chunk 매개 변수를 읽으려고 시도하는 경우 이는 정의되지 않은 동작이며 버그입니다.

vector_chunk 배열에 자동 범위가 있고 for 루프 반복이 끝날 때까지만 존재하기 때문입니다. pthread_create()이 반환되고 배열의 반환 값이 반환되면 루프 반복이 끝나고 배열 vector_chunk이 범위를 벗어나 효과적으로 제거됩니다.

vector_chunk이 범위를 벗어날 때 스레드가 루프 반복의 끝에 도달하기 전에 스레드가 실행되고 vector_chunk을 읽는다 고 보장 할 수 없습니다. vector_chunk이 범위를 벗어나면 worker()vector_chunk 매개 변수에 액세스하려는 시도는 정의되지 않은 동작이며 버그입니다.

해결 방법은 동적으로 할당 된 매개 변수와 모든 스레드 매개 변수 데이터를 전달하여 스레드에 매개 변수를 동적으로 할당하고 초기화 한 다음 시작하는 것입니다. 스레드는 매개 변수 데이터를 검색하고 해당 매개 변수를 할당 해제합니다.

+0

좋아, 그럼 ... 내가 어떻게 잘못 (지금 당장) 작동하게 만들 수 있습니다 - 주요 방법의 최대 범위 벡터 덩어리의 위치를 ​​변경하지 않습니다 .. – bordeo

+0

그 질문에 대답하기위한 정보가 충분하지 않습니다. stackoverflow.com의 모든 질문에는 질문 자체에 [mcve]가 포함되어야합니다. 언제든지 작동을 멈출 수있는 외부 사이트 링크는 충분하지 않습니다. –