2012-05-04 10 views
3

Cで、私たちはそうのようなスレッドを作成:なぜC言語のスレッドで関数の戻り値の型が(void *)である必要がありますか?

void * run(void * arg){ 
    printf("hello world\n"); 
} 

int main(){ 
    pthread_t thread; 
    int a = pthread_create(&thread, NULL, run, (void*)0); 
} 

をしかし、私はパラメータで(void *)にキャストした場合、私は、一方

void run(){} 

として実行宣言すると、それは動作しません。 pthread_createの場合、正常に動作します。したがって、戻り値の型が(void *)の関数のみを受け入れます。

なぜですか?

ありがとうございます!私のシステムで

答えて

4

man pthread_create言います:

start_routineもし戻り、終了ステータスとしてstart_routineの戻り値を使用して、pthread_exit()への暗黙の呼び出しがあったかのような効果があります。

この戻り値はpthread_join()機能により利用可能である:非NULL value_ptr引数で成功pthread_join()コールから戻っ

、終端スレッドによってpthread_exit()に渡された値がに格納されています位置はvalue_ptrによって参照されます。スレッドライブラリは、戻り値を期待して、スレッド終了後pthread_join()に指定された場所にそれを格納するため

+0

したがって、 'start_routine'の返された(void)ポインタは、' pthread_join'呼び出しの後に、必要に応じてルーチンから返される単純な戻り値を指しますか? – ysap

+0

...それは基本的にスレッドからメインプロセスに値を返すことができますか? – ysap

4

スレッド機能はvoid *を返すように宣言する必要があります。

スレッド戻り値が必要ない場合は、ただreturn 0;とすることができます。

0

どうしてですか?定義上、スレッドは独自のスタックを持つため、呼び出すことも、返すこともできません。しかし、ある初期のデータをスレッドに通知できることは、通常は役に立ちます。スレッド終了時に何らかの通知が有用な場合もあります。 OSの設計者はそれを知っていたため、起動時に固定量のデータをスレッドスタックにコピーし、終了時に通知することができました。 OSスレッド呼び出しは、言語に依存しないため、1つの機械幅のワードを普遍的に選択する必要があります。 Cはこれをvoid *として表します。おそらく型なしの値であることを示しています。

関連する問題