2010-06-04 48 views
6

我剛開始學習並行線程API和我下面教程here將參數傳遞爲void *是否合法?

然而,在pthread_create一個示例程序,樣本程序創建一個長變量和傳遞其價值,類型強制轉換爲void*。在線程入口函數中,它像一個long一樣對它進行解引用。

這合法嗎? 我知道如果我通過變量t的地址,每個線程將作用於相同的變量,而不是它的副本。我們可以這樣做嗎,因爲它是void*,編譯器不知道我們發送的是什麼類型?

#include <pthread.h> 
#include <stdio.h> 

#define NUM_THREADS  5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    printf("Hello World! It's me, thread #%ld!\n", tid); 
    pthread_exit(NULL); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0; t<NUM_THREADS; t++){ 
     printf("In main: creating thread %ld\n", t); 
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 
    pthread_exit(NULL); 
} 
+0

所以你的問題是關於傳遞指針的有效性或傳遞指針的有效性作爲pthread_create()的第四個參數? – qrdl 2010-06-04 09:29:46

+0

@qrdl:實際上它的兩個,但我更感興趣的是傳遞第四個參數給pthread_create,讓編譯器認爲你實際上是在發送一個地址。 – 2010-06-04 09:33:59

回答

4

此功能只要sizeof(long) <= sizeof(void*),而且每個值long都可以表示爲void*

更好的辦法是傳遞變量的地址。你可以從T*轉換到void*,並且可以安全地返回並且沒有任何假設。

+1

@Charles'sizeof(void)'和'sizeof(void *)'是不同的野獸 – qrdl 2010-06-04 09:41:50

+0

@qrdl:你就是! – 2010-06-04 09:48:27

4

它和任何類型的轉換一樣合法。關鍵是,除非參數指向,否則參數指向的值不能做任何事,因此tid = (long)threadid

檢查舊的Q & A When to use a void pointer?

+0

你的意思是'void *'意思是「指向某個東西」,但是在使用之前需要定義「something」,對吧? – Abel 2010-06-04 09:31:47

+0

@Abel:對。關鍵是當你想用一個無法給出類型信息的指針來做某件事時。 – 2010-06-04 09:38:43