2014-09-21 49 views
0

我寫了一個代碼來做一些多線程來測試我的dd的寫/讀速度。同一線程ID的

一切正在編譯和運行良好,但我注意到線程ID是相同的。

因此,我創建了一個條件(請參閱代碼註釋),它令人驚訝地表明我創建的每個線程都具有相同的ID。

int main(int argc, char *argv[]) { 
    //long filesize = 10000000; 
    int nb_threads = atoi(argv[2]); 
    pthread_t tid[4]; 
    int ok; 
    double latency; 
    double bandwith; 
    int err; 
    int i = 0; 
    srand(time(NULL)); 
    while(i < nb_threads){ 
     pthread_create(&(tid[i]),NULL,launch_dd_bm,(void *) argv); 
     pthread_join(tid[i], NULL); 
     /* if(!pthread_equal(tid[i],tid[i-1])){ 
       printf("Thread ID: %u",tid[i]); 
       i++; 
      } 
     */ 
     i++; 
    } 
    return EXIT_SUCCESS; 
} 

void *launch_dd_bm(void *arg); 

我知道我不測試線程是否成功創建,但他們是。 我剛剛刪除了上述代碼中的條件,以便您可以真正瞭解發生了什麼。

回答

2

你調用pthread_join()立即創建線程之後,所以會發生什麼是
主線程暫停並等待創建的線程來完成其
執行的執行。當第一個線程完成時,其Id不再使用,因此可以通過之後創建的線程「獲取」相同的ID。這就是爲什麼所有
你的線程都有相同的ID。
爲了避免這個問題,你應該在while循環之外調用pthread_join()。

2

pthread_create存儲「創建的線程的ID」。因此線程ID只能保證在當前正在運行的線程中唯一,而不是在進程中創建的所有線程中。一旦線程退出,其ID可以安全地重用。這與malloc返回新指針類似,只要你不釋放它們,在這一點上你可以重用那些指針。

如果你需要一個真正的永久ID,很容易實現一個共享計數器,例如,通過增加一個全局變量從launch_dd_bm(並記住用互斥體保護它)。

+0

但我的線程應該都是平行運行,那麼爲什麼不是這樣呢? 爲了測試我的dd,我需要在多線程的同時寫入或讀取。 – 2014-09-21 18:19:58

+4

@JahMyst如果你想讓你的線程並行運行,不要在'pthread_create()'後面的循環中調用'pthread_join()'。 – user4815162342 2014-09-21 18:22:26

+2

事實上,你應該有一個*獨立的循環*在每個線程之後調用'pthread_join'來創建全部循環。在同一個循環中執行這兩個操作,完全序列化該程序,就好像您剛剛在主線程中反覆調用'launch_dd_bm(argv)'一樣。 – 2014-09-21 18:43:08