2017-03-09 29 views

回答

1

設置了線程處理函數的原型。它必須是void* (*)(void*)。你不能傳遞一個接受別的東西的函數,即使是在投射時也是如此,因爲這將是未定義行爲的原因。

但POSIX允許你單個參數void*,這個參數足以傳遞任何東西的地址,因此不是那種限制。

所以,如果你想傳遞一些額外的參數,他們捆綁在一個結構:

struct my_data { 
    int n; 
    char c; 
    double d; 
}; 

void *variable_argument_function (int first_arg, ...) { 
    return NULL; 
} 

void* handler(void *vdata) { 
    struct my_data *data = vdata; 

    return variable_argument_function(data->n, 
            data->c, 
            data->d); 
    //use data->n, data->c, data->d 
} 

int main(void) { 
    struct my_data t_data = { 
    .n = 1, .c = 'a', .d = 3.14 
    }; 

    pthread_t t; 
    if (pthread_create(&t, NULL, &handler, &t_data) == 0) 
    pthread_join(t, NULL); 

    return 0; 
} 
+0

@YasserNezzari - 如果我收集正確,那麼是的。就像我在更新的代碼片段中那樣做。 – StoryTeller

+0

非常感謝你,這就是我需要的! –