2010-11-19 110 views
4

我想學習C多線程,並且我已經看到了一些罕見的東西。如何將參數傳遞給c多線程中的線程

我知道給線程傳遞參數必須用指針來完成。我找到了一個我不明白的例子。我會複製相關行:

pthread_t tid[MAX_THREADS] 
int n_veg 
pthread_create(&tid[n],NULL,caracter,(void *)n_veg) 

caracter顯然是一個預定義的函數。

現在,爲什麼我們使用void指針轉換而不是int指針轉換?有沒有相關的區別?

其次,爲什麼我們首先使用指針投射?我們不能像第一個參數那樣使用「& n_veg」嗎?

在此先感謝。

回答

10

由於您的問題都是相關的,我會一起回答它們:pthread_create需要void *參數,因此您可以真正傳遞任何需要的指針。在這種情況下,我們實際上並沒有傳遞一個指針,而只是一個簡單的整數值作爲指針。這意味着你將訪問它像這樣在caracter

int value = (int)n_veg; 

至於你提到,你很可能通過一個實際的指針作爲&n_veg和檢索這樣的值:

int value = *(int *)n_veg; 

事實上,在大多數情況下,你需要傳遞的數據不僅僅是一個整數,比如一個結構體,在這種情況下,你必須傳遞一個指針,因爲你不能簡單地將它轉換爲像整數這樣的指針。

傳遞指針時需要記住的一件事是,只要線程正在運行,n_veg就不能超出範圍。例如,如果你這樣做:

void test() { 
    int n_veg; 
    pthread_create(&tid[n],NULL,caracter,&n_veg); 
} 

然後&n_veg將是無效的,只要test回報,但線程可能仍在運行,將持有的地址無效。因此,傳遞給線程的結構通常是動態分配的,例如使用malloc,線程可以free一旦完成。

+0

那麼,傳遞一個真正的指針或者如果使用整數來轉換值,是否有真正的區別? 而且,爲什麼*(int *)n_veg? 對不起,如果第二個問題是愚蠢的,這是我編程的第二年,直到本週才使用java:/ – bluehallu 2010-11-19 00:43:11

+1

@Hallucynogenyc:是的。如果你傳入一個真實的指針,你可以使用指針改變原始值。關於'*(int *)n_veg':要使用'void *',您需要轉換爲實際類型,因此需要轉換爲'(int *)',然後'*'將引用指針以獲取值。 – casablanca 2010-11-19 00:45:00

+0

全部清楚。非常感謝你! – bluehallu 2010-11-19 00:47:56

0

pthread_create定義如下:

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

所以它需要一個void *作爲其最後一個參數。如果你省略了演員,編譯器會給你一個警告。

+0

哦,這只是該方法要求...我認爲無效指針是透明地操作該方法。算了吧。 – bluehallu 2010-11-19 00:28:03