2010-09-09 133 views
2

我爲線程創建了一個函數,但是我想將多個參數傳遞給該函數。如何將多個參數傳遞給線程函數

這裏是我的源代碼:

#include "work.h" 
#include <stdio.h> 
#include <unistd.h> 
#include <pthread.h> // compile with -lpthread 

int count = 20; 

void* ChildProc(void* arg) 
{ 
    int i; 

    for(i = 1; i <= count; i++) 
    { 
     printf("%s:%d from thread <%x>\n", arg, i, pthread_self()); 
     DoWork(i); 
    } 

    return NULL; 
} 

void ParentProc(void) 
{ 
    int i; 

    for(i = count/2; i > 0; i--) 
    { 
     printf("Parent:%d from thread <%x>\n", i, pthread_self()); 
     DoWork(i); 
    } 
} 

int main(void) 
{ 
    pthread_t child; 

    pthread_create(&child, NULL, ChildProc, "Child"); 

    ParentProc(); 

    pthread_join(child, NULL); // make child a non-daemon(foreground) thread 
} 

現在我該怎樣傳遞多個參數ChildProc()方法?

一種方法是傳遞數組或結構。但是如果我想傳遞多個變量而沒有數組或結構呢?

+0

是否有任何其他類似於pthread_create()的方法可以支持多個參數? – Searock 2010-09-09 05:59:27

回答

1

你可以通過一個void *緩衝流,如果你知道長度,那麼你可以訪問它們。它類似於執行GArrays

你是如何創建它們的?

void *buffer = malloc(sizeofelements); 
memcpy(buffer,element1,sizeof element1); 
memcpy(buffer+sizeof element1,element2, sizeof element2); 

注:上面的是不是一個可編譯的C代碼。你需要處理它。

您可以使用上述類型的東西。

您可以稍後訪問變量,因爲您已知道大小

+0

你的意思是「不是一個可編譯的C代碼」? – Searock 2010-09-09 10:09:34

+0

我的意思是它不會編譯,如果你CTRL-C CTRL-V,但是如果你使用的代碼和函數調用正確,它將工作。像'memcpy(dest,ptr,size);'和我寫的內容足以理解一個人必須按照這裏所述來做。 – 2010-09-09 10:33:15

+0

+1提供了一種替代方法。 – Searock 2010-09-09 10:49:50

7

一種快速和垃圾答案是創建一個結構,以容納所有參數,並通過其指針

+0

如何在C中創建參數類對象? – Searock 2010-09-09 05:56:47

+0

忘記**類對象**。在C語言中:創建一個結構來保存參數,從中實例化一個變量,設置參數,將這個變量的指針傳遞給 – mmonem 2010-09-09 06:07:51

+7

快速回答沒有什麼垃圾 - 這是正確的答案。 – 2010-09-09 06:09:16

3

一種方式是要麼通過一個陣列或結構。

這就是的方式。 指針到一個結構,也就是說。

如果我想通過一個數組或結構的多個變量呢?

然後你運氣不好。數組或指向結構的指針就是你需要的。

+0

是否有任何其他類似於pthread_create()的方法可以支持多個參數? – Searock 2010-09-09 05:59:51

+1

傳遞指向結構的指針,而不是結構本身。 – 2010-09-09 06:08:17

+3

@Searock:不 - 沒有任何其他方法類似於支持多個參數的pthread_create()。 – 2010-09-09 06:08:52