2011-10-26 68 views
1

我的問題是,什麼是pthread_create函數的格式和它調用的函數,在指針等方面?儘管我需要澄清我在這方面的知識,但我可以將頭部包裹在變量指針中,但是函數指針會變得很糟糕。pthread_create函數格式和指針 - C Linux的POSIX庫

我理解的首選格式是

void *threadfunc(void *arg); 

int main() 
{ 
    pthread_t threadinfo; 
    int samplearg; 
    pthread_create(&threadinfo, NULL, threadfunc, &samplearg); 
} 

然而,這會產生一個編譯器警告的ThreadFunc不是返回一個值,所以顯然是*一些是關於什麼的ThreadFunc返回時,函數的不是一個特點呢?

我也看到定義爲功能和格式在pthread_create像這樣:

void threadfunc(void *arg); 

pthread_create(&threadinfo, NULL, (void *)threadfunc, &samplearg); 

這兩個是正確的,或者是他們功能上等同?有人能向我解釋指向函數的指針的機制嗎?

最後一個問題,它會工作,在for循環產生多個線程,初始化int samplearg爲線程唯一值,然後將其傳遞到pthread_create(...)?我知道samplearg的範圍在threadfunc之內,我只是在檢查以確定C不遵循典型範圍規則 - 因爲sampleargfor()循環內創建,並且在for()迭代後通常會超出範圍循環,並且實際變量本身被傳遞而不是值。我會測試自己,但可能有一點你可以啓發我,在遠程Linux機器上開發對我來說有點麻煩。

+0

pthread_create()返回一個int。從手冊頁:返回值 如果成功,pthread_create()函數將返回零;否則,應返回一個錯誤編號以指示錯誤。 –

+0

@PeteWilson - 他不是在談論pthread_create()的返回值@ –

+0

@Brian Roach--所以他不是!感謝提貨。 –

回答

1

你還沒有給你的void *threadfunc(void *arg);版本,但我猜測,沒有提供給您返回語句。這就是編譯器警告你的原因。由於聲明表示必須返回void*,因此您應該返回void*。 A void*是指向任何指針類型的指針。只有void(不含星號)不需要返回語句,因爲它不返回任何內容。

順便說一下,返回值將被傳遞給pthread_join函數語句時,另一個線程連接到您正在啓動線程。

+0

是的,我沒有一個返回值,因爲我誤解'void * threadfunc(void * arg);'是一個具有void返回值和'*'指定的特殊屬性的函數。什麼是合適的「空白」返回?還是應該「返回」是別的東西?當然''pthread_exit()'會在'threadfunc()'本身中被調用。 –

+0

如果沒有什麼要返回到加入的線程,則返回NULL。 – doron

+0

我想我得到的指針void void return的目的 - 它是傳遞一個變量,然後將被轉換,類似於輸入參數如何傳遞,對嗎? –

0

傳遞給pthread_create()的函數應該返回一個指向線程退出狀態的void指針。

返回值,當你的線程調用pthread_join()退出後(無論是通過返回或顯式調用pthread_exit()

+0

所以你在說第一個函數定義爲'void * threadfunc(void * arg);'是正確的?將指針返回到void的目的是什麼?能夠使用從'pthread_join()'中檢索的指針重新輸入函數? –

1

轉到 '源' - POSIX標準。對於pthread_create(),它說:

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

也就是說,你的 '的start_routine' 必須返回一個void *並採取void *參數的函數。

void *possible_thread_start_routine(void *data) 
{ 
    SomeStruct *info = data; 
    ...main code for thread... 
    return 0; 
} 

傳遞給線程啓動例程的參數是在arg指定pthread_create()之一。

+0

'start_routine'周圍的括號內的指針指示什麼?即'(* start_routine)' –

+0

它表示一個'指向函數的指針'。 –