2012-09-09 73 views
1

請看看到pthread_create()原型,我們有:混淆將數據傳遞給pthread_create()...它是如何工作的?

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

到最後一個參數是一個空指針。但看看互聯網上的一些代碼,我看到開發人員在做:

long t; 
pthread_create(&thread, NULL, function, (void*)t); 

它的工作原理!我的意思是他們沒有這樣做:

pthread_create(&thread, NULL, function, (void*)&t); 

換句話說,沒有使用「t」的引用。

但是,如果我將數據類型更改爲「int」而不是「長」..不起作用。

我相信應該總是考慮參考,但是你知道爲什麼長時間工作沒有參考?

謝謝你們!

回答

0

傳遞給線程函數的參數是void*。在一般情況下,該指針可指向函數可以使用的某些數據塊。

但是,請記住指針本身是一個值。如果您傳遞的數據量足夠小以適合void* - 即如果您需要傳遞給函數的所有值都是整數值,則通常只將該值用作線程函數的數據。這就是發生這種情況:

long t; 

t = /* some value to pass to the thread */; 

pthread_create(&thread, NULL, function, (void*)t); 

這樣做的一個好處是,您沒有生存期問題來處理線程數據。

+0

但是爲什麼不同樣的事情工作機智'int'?如果'long'足夠小以適應'void *',那麼'int'不應該是這樣嗎? – Shredderroy

+0

@Shredderroy - 我們必須看到具體的代碼來說明有什麼不同 - 我懷疑這是與符號擴展有關的事情,這種擴展是或不會發生的,因爲具體的方式會從/ void *被編碼。 –

+0

當我讀到這個問題時,我最初的想法是'long'的值可能被隱式地認爲是一個地址,但'int'的值不是。但我不確定。此外,似乎我的想法是實現或編譯器特定的,而原始的海報似乎打算將其視爲一般事件。 – Shredderroy