2017-03-09 13 views
0

void pthread_create(& thr、NULL、thre、???)のような可変引数(n個の引数)を持つ関数を実装する方法:void * thre(int、...) ありがとうございます。pthread_create()の可変引数を持つ関数?

+0

私はあなたが望むものを正確にわからないんだけど、解決策は、ソフトウェア・エンジニアリングの基本的な定理を使用することが考えられます:間接参照のレベルを追加します。 – StoryTeller

+0

NVM、私はそれを得たと思います。 – StoryTeller

答えて

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

ありがとうございました。 –

関連する問題