2011-09-21 42 views
0

這是一個經常出現的線程創建代碼的例子。 pthread_create使用了很多指針/地址,我想知道爲什麼會這樣。關於pthreads&指針的問題

pthread_t threads[NUM_THREADS]; 
    long t; 
     for(t=0; t<NUM_THREADS; t++){ 
      rc = pthread_create(&threads[t], NULL, &someMethod, (void *)t); 
     } 

是否有使用「&」來指代變量陣列的主要優點或差「線程」以及「的someMethod」(而不是僅僅「線程」和只是「的someMethod」)?而且,爲什麼't'通常作爲空指針而不是't'傳遞?

回答

2
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
    void *(*start_routine)(void*), void *arg); 

你需要一個pointer傳遞給pthread_t變量pthread_create&threads[t]threads+t達到此目的。 threads[t]沒有。 pthread_create需要一個指針,以便它可以通過它返回一個值。

someMethod是第三個參數的合適表達式,因爲它是函數的地址。我認爲&someMethod是多餘的,但我不確定。

您正在將t轉換爲void *,以便將long卡入void *。我不認爲long保證適合void *。即使保證存在,這絕對是不理想的解決方案。您應該傳遞指向t&t,無需強制轉換)的指針,以確保與預期的void *兼容。不要忘記相應地調整someMethod


pthread_t threads[NUM_THREADS]; 
long t; 
for (t=0; t<NUM_THREADS; t++) { 
    rc = pthread_create(&threads[t], NULL, someMethod, &t); 
}