2016-08-24 91 views
0

我在C++中運行以下代碼。數組偏移量C++ pthreads返回

它按預期運行,但是,第一個結果在第二個循環中爲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,但對於其他所有我,它不是)。看起來似乎一切正常。

更正:它實際上不是偏移量,而是第一個值爲NULL,所以有一個較小的值。

+0

你不能加入'pthread_t_array [i]',因爲它不是有效的'pthread_t'。 (你將它存儲在(不必要的)變量'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]。可以隨時停止工作的外部網站鏈接不足。 –